旋转后接收两个不同高度的键盘

Recieve two different height of keyboard after rotation

我有一个视图,它在键盘出现时调整约束的大小。所以当键盘出现和消失时我会收到通知。

当键盘已经显示并且我旋转屏幕时会出现上述行为。然后发生下一个动作:

  1. 已调用 UIKeyboardWillHideNotification
  2. 调用了 UIKeyboardWillShowNotification(使用键盘的旧高度)
  3. 已调用 UIKeyboardWillShowNotification(使用新的键盘高度)

因此,updateView 函数首先接收一个高度,然后接收一个不同的高度。这导致视图的奇怪移动调整了两倍的值。

override func viewDidLoad() {

    super.viewDidLoad()

    // Creates notification when keyboard appears and disappears
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)

}

deinit {

    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)

}

func keyboardWillShow(notification: NSNotification) {

    self.adjustingHeight(true, notification: notification)

}

func keyboardWillHide(notification: NSNotification) {

    self.adjustingHeight(false, notification: notification)

}

private func adjustingHeight(show: Bool, notification: NSNotification) {

    // Gets notification information in an dictionary
    var userInfo = notification.userInfo!
    // From information dictionary gets keyboard’s size
    let keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
    // Gets the time required for keyboard pop up animation
    let animationDurarion = userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSTimeInterval
    // Animation moving constraint at same speed of moving keyboard & change bottom constraint accordingly.
    if show {
        self.bottomConstraint.constant = (CGRectGetHeight(keyboardFrame) + self.bottomConstraintConstantDefault / 2)
    } else {
        self.bottomConstraint.constant = self.bottomConstraintConstantDefault
    }
    UIView.animateWithDuration(animationDurarion) {
        self.view.layoutIfNeeded()
    }

    self.hideLogoIfSmall()

}

我终于找到了解决办法。当我得到 keyboardFrame 时,我正在使用 UIKeyboardFrameBeginUserInfoKey 动画开始前的 returns 键盘帧。正确的做法是 UIKeyboardFrameEndUserInfoKey 动画完成后 returns 键盘的帧。

let keyboardFrame: CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()