Клавиатура скрывается раньше, чем вид

#ios #swift #keyboard

#iOS #swift #клавиатура

Вопрос:

Клавиатура добавляется в качестве вложенного представления в контейнер в нижней части контроллера представления коллекции, но при попытке скрыть ее кажется, что загрузка клавиатуры происходит быстрее, чем увеличение размера представления (темный экран появляется сразу после того, как клавиатура будет скрыта). Кроме того, при запуске проекта в первый раз за день клавиатура не отображается, пока я не нажму «command K», после чего над клавиатурой и под вводом появляется темный вид, так как размер клавиатуры отображается.

     @objc func handleShowKeyboard(_ notification: Notification) {
        if let keyboaradSize: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue? {
            let keyboardFram = keyboaradSize.cgRectValue
            UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: {
                self.view.frame.origin.y -= self.view.safeAreaInsets.bottom
                self.view.frame.origin.y -= keyboardFram.height
                self.view.layoutIfNeeded()

            }) { (completion) in

            }
        }
    }

    @objc func handleHideKeyboard(_ notification: Notification) {
        if let keyboaradSize: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue? {
            let keyboardFram = keyboaradSize.cgRectValue
            UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: {

                self.view.frame.origin.y  = self.view.safeAreaInsets.bottom
                self.view.frame.origin.y  = keyboardFram.height
                self.view.layoutIfNeeded()

            }) { (completion) in

            }
        }
    }

  

введите описание изображения здесь

Ответ №1:

Прочитайте этот ключ

 UIKeyboardAnimationDurationUserInfoKey
  

значение и используйте его в качестве продолжительности анимации


 guard let userInfo = notification.userInfo else {
    return
} 

guard let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,
    let curve =  userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {

        return
}
UIView.animate(withDuration: duration, delay: 0, options: [UIView.AnimationOptions(rawValue: curve)], animations: {
   ///
}) { (completed) in

}