Несогласованные уведомления клавиатуры при представлении контроллера представления

У меня есть контроллер вида A который в настоящее время находится в режиме редактирования, то есть имеет текстовое поле, которое является первым респондентом.

Переход с видимой клавиатурой

Теперь я представляю вид контроллера B от A с пользовательским аниматором:

class Animator: NSObject, UIViewControllerAnimatedTransitioning {

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 1
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        print("-----  Transition Animation BEGIN -----")
        guard let toView = transitionContext.view(forKey: .to) else {
            return
        }
        transitionContext.containerView.addSubview(toView)
        print("-----  Transition Animation ADDED SUBVIEW -----")
        toView.frame = transitionContext.containerView.bounds
        toView.layoutIfNeeded()
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }     
}

По причинам простоты этот аниматор не сильно оживляет: он только добавляет представление контроллера представления назначения в иерархию и все.

Посмотреть контроллер B также имеет текстовое поле, и когда оно появляется на экране, я хочу, чтобы оно немедленно стало первым респондентом. Таким образом, я добавил этот код для просмотра контроллера B:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    textField.becomeFirstResponder()
}

Теперь интересная часть того, что происходит между

-----  Transition Animation BEGIN -----

а также

-----  Transition Animation ADDED SUBVIEW -----

1. Внутри Rootview

Когда текстовое поле в контроллере представления A находится где-нибудь внутри его корневого представления, это уведомления от клавиатуры, которые я получаю NotificationCenter:

-----  Transition Animation BEGIN -----
UIKeyboardDidChangeFrameNotification
UIKeyboardDidHideNotification
UIKeyboardWillChangeFrameNotification
UIKeyboardWillShowNotification
UIKeyboardDidChangeFrameNotification
UIKeyboardDidShowNotification
-----  Transition Animation ADDED SUBVIEW -----

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

2. Внутри коллекции вид ячейки

Когда текстовое поле помещается в ячейку представления коллекции контроллера представления A однако во время перехода не поступают уведомления от клавиатуры:

-----  Transition Animation BEGIN -----
-----  Transition Animation ADDED SUBVIEW -----

В любом случае это уведомления, которые я получаю до начала анимации перехода:

UIKeyboardWillChangeFrameNotification
UIKeyboardWillHideNotification

Это проблематично, так как во втором сценарии вид контроллера B до сих пор "думает", что клавиатура скрыта во время анимации. Таким образом, я не могу разметить его вид и создать правильную анимацию.

Любая идея, почему уведомления клавиатуры не запускаются в сценарии 2 и как я могу это исправить?

0 ответов

Другие вопросы по тегам