Нажимаем UIViews вверх для UIKeyboard - PullRequest
0 голосов
/ 25 октября 2018

Я добавил наблюдателя willShow и willHide для клавиатуры и пытаюсь поднять нижний UITextView вверх, чтобы настроить отображение UIKeyboard.Однако моя клавиатура выдвигается дальше, чем просто высота рамки клавиатуры.Как я могу ограничить нижнюю привязку UITextView к верхней части клавиатуры?

// Observer method
@objc func handleKeyboardNotification(_ notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as AnyObject).cgRectValue
        let isKeyboardShowing = (notification.name == UIResponder.keyboardWillShowNotification)

        // Push views up if keyboard is showing, otherwise set constant back to 0
        messageInputBottomAnchor?.constant = isKeyboardShowing ? -(keyboardFrame?.height)! : 0

        UIView.animate(withDuration: 0.5) {
            self.view.layoutIfNeeded()
        }
    }
}

Picture illustrating the problem

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Я оставил свой UITextView ограниченным основанием safeAreaLayoutGuide, но я добавил CGFloat для представления отступа внизу экрана.По умолчанию он был равен 0, но если iOS 11 была доступна (для учета iPhone X и его нижнего отступа), я установил для CGFloat значение UIApplication.shared.keyWindow! .SafeAreaInsets.bottom.Затем, когда я переместил UITextView вверх или вниз в соответствии с UIKeyboard, я вычел размер CGFloat.

//Global var 
var safeAreaBottom: CGFloat = 0.0

// Verify screen bottom in viewDidLoad
if #available(iOS 11, *) {
   safeAreaBottom = UIApplication.shared.keyWindow!.safeAreaInsets.bottom
}

// Push views up if keyboard is showing, otherwise set constant back to 0. Subtract safeAreaBottom if iOS 11 is available to compensate for the bottom padding
   textViewBottomAnchorToSafeArea?.constant = isKeyboardShowing ? -((keyboardFrame?.height)! - safeAreaBottom) : 0
0 голосов
/ 25 октября 2018

То, что я сделал, было

  • Я создал 2 различных ограничения на UITextView, одно для суперпредставления и одно для сейфа.
  • Подключите оба эти ограничения к контроллеру представления и убедитесь, что они не слабые ссылки.
  • В viewDidLoad убедитесь, что ограничение safearea активно, а ограничение superview - нет.
  • В ваших слушателях, когда клавиатура появляется, переключите поля isActive ограничений, чтобы теперь суперпредставление было активным, а safearea неактивным.
  • В слушателе, когда он собирается уйти в отставку, переключите их обратно.

Причина необходимости убедиться, что ссылки не являются weak, заключается в том, что когда вы устанавливаетеisActive в поле false, оно на самом деле удалит его, и если вы попытаетесь сослаться на ограничение позже, вы обнаружите, что пытаетесь получить доступ к члену объекта nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...