我有一个目前处于编辑模式的视图控制器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 -----
当视图控制器A
中的文本字段放在位于其根视图内的任何位置时,这些是我从NotificationCenter
收到的键盘通知:
----- Transition Animation BEGIN -----
UIKeyboardDidChangeFrameNotification
UIKeyboardDidHideNotification
UIKeyboardWillChangeFrameNotification
UIKeyboardWillShowNotification
UIKeyboardDidChangeFrameNotification
UIKeyboardDidShowNotification
----- Transition Animation ADDED SUBVIEW -----
换句话说:将目标视图控制器的视图添加到转换的容器视图会导致触发所有这些键盘通知。这很棒,因为之后我可以更新B
的布局来考虑键盘,并将这些布局更改应用到我的过渡动画中。
当文本字段位于视图控制器A
的集合视图单元中时,转换期间不会收到任何键盘通知:
----- Transition Animation BEGIN -----
----- Transition Animation ADDED SUBVIEW -----
在任何情况下,这些是我在过渡动画开始之前收到的通知
UIKeyboardWillChangeFrameNotification
UIKeyboardWillHideNotification
这是有问题的,因为在第二个场景中,控制器B
仍“认为”在动画期间隐藏了键盘。因此,我无法布局其视图并创建正确的动画。