Получите две разные высоты клавиатуры после вращения

У меня есть представление, которое изменяет размер ограничения при появлении клавиатуры. Так что у меня есть уведомления, когда клавиатура появляется и исчезает.

Описанное выше поведение возникает, когда клавиатура уже отображается, и я поворачиваю экран. Затем происходят следующие действия:

  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()

}

person angeldev    schedule 05.02.2016    source источник
comment
Не очень уверен, но, может быть, можно добавить еще одно наблюдение для UIKeyboardWillChangeFrameNotification и обрабатывать высоту в его селекторе?   -  person Allen    schedule 05.02.2016
comment
@ Аллен Я думаю, что я был бы в такой же ситуации. Мне пришлось бы иметь дело с высотой в UIKeyboardWillShowNotification, а UIKeyboardWillChangeFrameNotification также вызывается дважды с разной высотой.   -  person angeldev    schedule 05.02.2016


Ответы (1)


Наконец я нашел решение. Когда я получаю keyboardFrame, я использовал UIKeyboardFrameBeginUserInfoKey, который возвращает кадр клавиатуры до начала анимации. Правильный способ сделать это с помощью UIKeyboardFrameEndUserInfoKey, который возвращает кадр клавиатуры после завершения анимации.

let keyboardFrame: CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
person angeldev    schedule 05.02.2016
comment
Целый день мучился с анимацией клавиатуры. Это решение решило это. Спасибо! - person anoo_radha; 22.11.2019