在我的应用我有一些人认为这是由键盘覆盖时,它显示了一个文本字段。 所以,我必须滚动视图(甚至重新排列子视图)。 要做到这一点我:
注册键盘的通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moveViewUp) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moveViewDown) name:UIKeyboardWillHideNotification object:nil];
在接收到通知时,使用块的动画像这样移动视图:
- (void)moveViewUp { void (^animations)(void) = nil; oldViewFrame = self.view.frame; animations = ^{ CGRect newViewFrame = oldViewFrame; newViewFrame.origin.y -= kViewOffset; self.view.frame = newViewFrame; }; [UIView animateWithDuration:1.0 animations:animations]; } - (void)moveViewDown { void (^animations)(void) = nil; animations = ^{ self.view.frame = oldViewFrame; }; [UIView animateWithDuration:1.0 animations:animations]; }
这工作得很好,认为向上和向下滚动,直到我添加一些更多的动画。 具体地,当用户点击一个按钮我添加到下一视图的转变:
- (IBAction)switchToNextView:(id)sender {
// [self presentModalViewController:nextViewController animated:YES];
[UIView transitionFromView:self.view
toView:self.nextView
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromRight
completion:nil];
}
现在,我们抓住了问题。
如果当按钮轻敲第一视图被转移(即意味着该键盘是可见的),到下一个视图的转换同时开始作为键盘滑下,但是视图本身不移动了 ,所以一秒钟我们其实可以看到下面的图。 那是不对的。 当我提出下一个视图模态(见注释行)所有动画去,因为我希望他们:即键盘隐藏,视图从右翻转和向下滚动-所有在同一时间。 这将是很好,但问题是,我居然没有一个UIViewController
的这一观点。 其实我试图模仿不具备模态行为UIViewController
(为什么这样呢? 也许它只是一个糟糕的设计,我会后对另外一个问题 )。
那么,为什么在这种情况下,从动画moveViewDown
方法没有在适当的时候触发?
更新1
我添加了一个调试打印每个功能检查调用的顺序,这是我得到:
-[KeyboardAnimationViewController moveViewUp]
__-[KeyboardAnimationViewController moveViewUp]_block_invoke_1 <-- scroll up animation
-[KeyboardAnimationViewController switchToNextView:]
-[KeyboardAnimationViewController moveViewDown]
__-[KeyboardAnimationViewController moveViewDown]_block_invoke_1 <-- scroll down animation
即使我明确地这样的转变之前的移动视图下
- (IBAction)switchToNextView:(id)sender {
// [self presentModalViewController:nextViewController animated:YES];
NSLog(@"%s", __PRETTY_FUNCTION__);
if (self.view.frame.origin.x < 0)
[self moveViewDown];
[UIView transitionFromView:self.view
toView:self.nextView
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromRight
completion:nil];
}
我得到完全相同的日志。
更新2
我已经尝试一些并提出以下结论:
- 如果我打电话
moveViewDown
或resignFirstResponder:
明确,动画被推迟,直到当前运行循环的末尾,当所有未决的动画居然开始播放。 虽然动画块日志立即控制台- 觉得奇怪,我! - 该方法
transitionFromView:toView:duration:options:completion:
(也许transitionWithView:duration:options:animations:completion:
也没有检查这一项)显然让的“从视图”快照和“对视“并创建使用这些快照仅动画。 由于视图的滚动被推迟,当视图仍偏移快照而成。 该方法在某种程度上忽略甚至UIViewAnimationOptionAllowAnimatedContent
选项 。 - 我设法使用任何期望的效果
animateWithDuration: ... completion:
方法。 这些方法似乎忽视像过渡选择UIViewAnimationOptionTransitionFlipFromRight
。 - 键盘开始隐藏(隐含的),并发送相应的通知时
removeFromSuperview
被调用。
如果我错了地方请指正。