UIView的显示/隐藏键盘上框动画过渡与动画内容(UIView block animation t

2019-09-28 19:56发布

在我的应用我有一些人认为这是由键盘覆盖时,它显示了一个文本字段。 所以,我必须滚动视图(甚至重新排列子视图)。 要做到这一点我:

  1. 注册键盘的通知:

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moveViewUp) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moveViewDown) name:UIKeyboardWillHideNotification object:nil]; 
  2. 在接收到通知时,使用块的动画像这样移动视图:

     - (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

我已经尝试一些并提出以下结论:

  1. 如果我打电话moveViewDownresignFirstResponder:明确,动画被推迟,直到当前运行循环的末尾,当所有未决的动画居然开始播放。 虽然动画块日志立即控制台- 觉得奇怪,我!
  2. 该方法transitionFromView:toView:duration:options:completion: (也许transitionWithView:duration:options:animations:completion:也没有检查这一项)显然让的“从视图”快照和“对视“并创建使用这些快照仅动画。 由于视图的滚动被推迟,当视图仍偏移快照而成。 该方法在某种程度上忽略甚至UIViewAnimationOptionAllowAnimatedContent选项
  3. 我设法使用任何期望的效果animateWithDuration: ... completion:方法。 这些方法似乎忽视过渡选择 UIViewAnimationOptionTransitionFlipFromRight
  4. 键盘开始隐藏(隐含的),并发送相应的通知时removeFromSuperview被调用。

如果我错了地方请指正。

Answer 1:

如果你试图模拟无模态行为UIViewController我想你想你的下一个视图从屏幕右下方出现? 纠正我,如果我错了。 如果你想这样的动画:你可以尝试一种变通,你改变在未来视图的帧animation块,使得它看起来好像它类似于presentModalViewController



文章来源: UIView block animation transitions with animated content on showing/hiding keyboard