Uzgodnij swoje ograniczenia z numerem ViewController
. Na razie będę nazywać to jako yourConstraint
. Następnie dodaj kod do wykrycia, gdy klawiatura jest pokazywana i kiedy jest odrzucana. Tam odpowiednio zmienisz constant
ograniczenia. To pozwala ci dalej używać ograniczeń.
W viewWillAppear
:
NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) // <=== Replace YourViewController with name of your view controller
NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) // <=== Replace YourViewController with name of your view controller
W viewWillDisappear
:
NotificationCenter.default.removeObserver(self)
w twojej UIViewController
@objc private func keyboardWillShow(notification: Notification) {
guard let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
yourConstraint.isActive = false // <===
view.layoutIfNeeded()
return
}
let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4
yourConstraint.constant = newValue // <===
UIView.animate(withDuration: duration) {
self.view.layoutIfNeeded()
}
}
@objc private func keyboardWillHide(notification: Notification) {
let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4
yourConstraint.constant = oldValue
UIView.animate(withDuration: duration) {
self.view.layoutIfNeeded()
}
}
UIView.animate
nie jest konieczne (wewnątrz bloku jest), ale sprawia, że przejście wygląda dobrze.
Dzięki bro. Miałem zamiar wdrożyć tę logikę, ale odpowiedziałeś poprawnie. Czy to nie dziwne, że musimy sprawdzić system operacyjny? 'UIKeyboardFrameEndUserInfoKey' powinien zwracać wysokość odejmując wstawki obszaru bezpiecznego. – Amit
@Amit Musisz sprawdzić wersję, jeśli docelowa liczba wdrożeń jest mniejsza niż 11.0, ponieważ 'safeAreaInsets' nie istnieje przed iOS 11. – nathan