设备旋转后UIKeyboard高度不同

时间:2018-03-30 07:40:27

标签: ios swift ipad rotation uikeyboard

我遇到的问题是设备旋转后的键盘高度:

guard let keyboardSize = sender.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue else { return }

let keyboardHeight = keyboardSize.cgRectValue.height

与正常值不同。正常键盘高度(在测试设备上)为398,旋转后高度为142.

更多背景信息:

我写了一个仅限iPad的应用程序,即使显示键盘,该应用程序也应始终坚持中心(Y)。对于这种情况,我将中心Y约束作为出口。我为UIKeyboardWillShowUIKeyboardWillHide通知注册了我的ViewController。当调用隐藏通知时,我将约束常量设置为0.当调用显示通知时,我根据剩余的视图空间(view.height - keyboard.height)计算新的中心Y.

第一次调用UIKeyboardWillShow时一切正常。但是在旋转设备后,键盘高度不同,我的计算给出了错误的值。

如何在显示键盘的情况下正确计算旋转中心Y?

2 个答案:

答案 0 :(得分:0)

Farhan Arshad是正确的,UIKeyboardFrameEndUserInfoKey将为您提供更好的结果,但是并不能解决您提到的问题。

注册UIKeyboardWillShow(或UIKeyboardWillChangeFrame)时,从纵向旋转到横向旋转时,实际上会收到多个通知。第一个通知的键盘高度为142像素,第二个通知的键盘高度为398像素。使用第二个通知作为约束值,它可以解决您的问题。

答案 1 :(得分:-1)

良好做法是添加/删除观察者:

override func viewDidAppear(_ animated: Bool) {
        NotificationCenter.default.addObserver(self, selector:#selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
    }


override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
}

这是解决问题的关键 请尝试阅读UIKeyboardFrameEndUserInfoKey

Swift4需要

@objc

    @objc func keyboardWillShow(notification: NSNotification) {
      if let keyboardSize = (notification.userInfo? 
      [UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

                //Your code here

      }
    }