Анимация UIView не работает внутри события KeyboardWillShowNotification

Я пытаюсь анимировать представление во время отображения/скрытия клавиатуры, но оно не работает, анимация использует время продолжительности анимации клавиатуры вместо моего.

Я обнаружил здесь, что это нормально, поскольку на клавиатуре есть блок анимации, предоставляемый средой выполнения. Однако это может быть переопределено в качестве параметров: https://developer.apple.com/documentation/uikit/uiview/animationoptions/1622434-overrideinheritedduration

Однако он не работает, он игнорирует мою конфигурацию и вместо этого использует клавиатуру. Я пытался обернуть код с помощью Dispatch.main.async, и иногда это работает, а иногда нет.

Кто-нибудь знает, как это исправить?

Я подумал, что это может быть связано с тем, что мое ограничение обновляется внутри блока клавиатуры, и, поскольку у него есть собственный блок анимации, он может быть уже обновлен при запуске моей пользовательской анимации, не уверен, что это имеет смысл.

    @objc func keyboardWillShow(notification: NSNotification) {

         if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {


            constraint.constant = -300

            DispatchQueue.main.sync {
                 UIView.animate(withDuration: 15, delay: 0, options: [.overrideInheritedDuration], animations: {
                               self.view.layoutIfNeeded()
                           }, completion: nil)
            }


        }

    }

person ddacrs    schedule 29.02.2020    source источник


Ответы (1)


UIView.animate - это асинхронная задача, поэтому вам не нужно использовать Dispatch Async :) Я не знаю, как вы можете определить, появится или исчезнет клавиатура, и я думаю, что это проблема. С моим способом он работает отлично! Это мой код:

@objc func keyboardWillAppear() {
self.constraint.constant -= 100
UIView.animate(withDuration: 2, delay: 0, options: [.overrideInheritedDuration], animations: {
  self.view.layoutIfNeeded()
}) { _ in }

}

@objc func keyboardWillDisappear() {
self.constraint.constant += 100
UIView.animate(withDuration: 2, delay: 0, options: [.overrideInheritedDuration], animations: {
  self.view.layoutIfNeeded()
}) { _ in }

}

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

person Đỗ Nhật Kha    schedule 21.07.2020