Bu konudaki popüler cevaplardan biri aşağıdaki kodu kullanır:
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Görünümünüzü statik bir miktarda dengelemede bariz bir sorun var. Bir cihazda güzel görünecek, ancak diğer boyut yapılandırmalarında kötü görünecektir. Klavyelerin yüksekliğini almanız ve bunu ofset değeriniz olarak kullanmanız gerekir.
İşte size bir çözüm tüm cihazlarda çalışan ve kullanıcının yazarken metin tahmini alanını gizlediği kenar durumunu işleyen .
Çözüm
Aşağıda not etmek önemlidir, self.view.window'u nesne parametremiz olarak geçiriyoruz. Bu bize klavyemizden yüksekliği gibi veriler sağlayacaktır!
@IBOutlet weak var messageField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: self.view.window)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: self.view.window)
}
func keyboardWillHide(sender: NSNotification) {
let userInfo: [NSObject : AnyObject] = sender.userInfo!
let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
self.view.frame.origin.y += keyboardSize.height
}
Tüm cihazlarda güzel görünmesini sağlayacağız ve kullanıcının tahmini metin alanını eklediği veya çıkardığı durumu ele alacağız.
func keyboardWillShow(sender: NSNotification) {
let userInfo: [NSObject : AnyObject] = sender.userInfo!
let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size
if keyboardSize.height == offset.height {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y -= keyboardSize.height
})
} else {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y += keyboardSize.height - offset.height
})
}
}
Gözlemcileri Kaldır
Gereksiz mesajların iletilmesini önlemek için görünümden ayrılmadan önce gözlemcilerinizi kaldırmayı unutmayın.
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: self.view.window)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: self.view.window)
}
Yorumlardan gelen soruya göre güncelleme:
İki veya daha fazla metin alanınız varsa, view.frame.origin.y dosyanızın sıfır olup olmadığını kontrol edebilirsiniz.
func keyboardWillShow(sender: NSNotification) {
let userInfo: [NSObject : AnyObject] = sender.userInfo!
let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size
if keyboardSize.height == offset.height {
if self.view.frame.origin.y == 0 {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y -= keyboardSize.height
})
}
} else {
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.view.frame.origin.y += keyboardSize.height - offset.height
})
}
print(self.view.frame.origin.y)
}