Jedna z popularnych odpowiedzi w tym wątku używa następującego kodu:
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Istnieje oczywisty problem z przesunięciem widoku o wartość statyczną. Będzie ładnie wyglądać na jednym urządzeniu, ale będzie źle wyglądać przy dowolnej konfiguracji rozmiaru. Musisz uzyskać wysokość klawiatury i użyć jej jako wartości przesunięcia.
Oto rozwiązanie, które działa na wszystkich urządzeniach i obsługuje wielkość liter, w której użytkownik ukrywa predykcyjne pole tekstowe podczas pisania.
Rozwiązanie
Ważne, aby pamiętać, że jako parametr obiektu przekazujemy self.view.window. To zapewni nam dane z naszej klawiatury, takie jak jej wysokość!
@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
}
Sprawimy, że będzie ładnie wyglądał na wszystkich urządzeniach i obsłuży przypadek, w którym użytkownik dodaje lub usuwa przewidywane pole tekstowe.
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
})
}
}
Usuń obserwatorów
Nie zapomnij usunąć obserwatorów przed opuszczeniem widoku, aby zapobiec przesyłaniu niepotrzebnych wiadomości.
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)
}
Aktualizacja na podstawie pytania z komentarzy:
Jeśli masz dwa lub więcej pól tekstowych, możesz sprawdzić, czy wartość view.frame.origin.y wynosi zero.
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)
}