2017-11-14 50 views
8

Utworzyłem interfejs użytkownika czatu, w którym dodałem constraint dla tableView na dole ekranu. Ja zmieniając wartość wiązania dodając wysokość klawiatury, która działa poprawnie na wszystkich urządzeniach z wyjątkiem iPhone X.Pojawia się klawiatura iPhone X pokazująca dodatkową przestrzeń

UI gdy klucz deska nie jest widoczny:

enter image description here

co jest w porządku.

Problem jest, gdy pojawia się klawiatura spacja jest widoczny pomiędzy TextView i klawiatury:

enter image description here

Czy muszę spróbować innego podejścia do tego czy może on zostać rozwiązany za pomocą wiązań?

Odpowiedz

9

Spróbuj odjąć wysokość wstawki dolnej strefy bezpiecznej podczas obliczania wartości wiązania.

Oto przykładowa implementacja, która obsługuje powiadomienie UIKeyboardWillChangeFrame.

@objc private func keyboardWillChange(_ notification: Notification) { 
    guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } 
    let newHeight: CGFloat 
    if #available(iOS 11.0, *) { 
     newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom 
    } else { 
     newHeight = value.cgRectValue.height 
    } 
    myConstraint.value = newHeight 
} 
+0

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

+0

@Amit Musisz sprawdzić wersję, jeśli docelowa liczba wdrożeń jest mniejsza niż 11.0, ponieważ 'safeAreaInsets' nie istnieje przed iOS 11. – nathan

0

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.

+0

Zrobiłem to samo. Problem to "nowa wartość". Dodałem 'newValue' jako' keyboardSize.height', która działa idealnie na wszystkich urządzeniach z wyjątkiem iPhone X. Jak widać na pierwszym obrazie jest biała przestrzeń dla nowej linii, aby zamknąć aplikację. Myślę, że przestrzeń dodaje się, gdy pojawia się klawiatura. – Amit

+0

Rozumiem. Przepraszam, że duplikuję twoje wysiłki ... Czy możesz opublikować zrzut ekranu z hierarchią widoku w swoim scenopisie? Czy próbowałeś też ustawić inne ograniczenie tylko dla iPhone'a X? Możesz rozróżnić urządzenia z czymś takim https://stackoverflow.com/a/26962452/7270113 – erikmartens