Несогласованные уведомления клавиатуры при представлении контроллера представления
У меня есть контроллер вида 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
до сих пор "думает", что клавиатура скрыта во время анимации. Таким образом, я не могу разметить его вид и создать правильную анимацию.