Objective c UIView将消失时,UIView动画停止

Objective c UIView将消失时,UIView动画停止,objective-c,objective-c-blocks,uiviewanimation,Objective C,Objective C Blocks,Uiviewanimation,我不太喜欢iOS动画。我试图实现的是一个简单的消息视图,它从屏幕底部垂直滑动到给定的y,然后在几秒钟后UIView垂直回滚到屏幕外 [UIView animateWithDuration:0.5f animations:^{ self.messageView.frame=CGRectMake(x, y -80, width, height); } co

我不太喜欢iOS动画。我试图实现的是一个简单的消息视图,它从屏幕底部垂直滑动到给定的y,然后在几秒钟后UIView垂直回滚到屏幕外

[UIView animateWithDuration:0.5f
                 animations:^{
                     self.messageView.frame=CGRectMake(x, y -80, width, height);
                 }

                 completion:^(BOOL finished){
                     if (finished) {

                         [UIView animateWithDuration:0.5f delay:2.0f options:UIViewAnimationOptionCurveLinear
                                          animations:^{
                                              self.messageView.frame=CGRectMake(x, y + 80, width, height);
                                          }

                                          completion:^(BOOL finished){
                                              // do something...
                                          }
                          ];
                     }
                 }  ];
这工作正常,但在iOS UITabBar应用程序中使用此机制时遇到问题:当我更改选项卡时,动画停止,我实际上可以看到“完成”完成为“false”。因此,不调用第二个块,消息视图保持打开状态

以下是问题:

  • 我首先关心的是了解我编写的代码是否正确,关于嵌套动画
  • 我可以通过忽略“已完成”并执行代码来解决问题,但我觉得这不是一个好主意
  • 在最后一个完成块中,我加入了一些编程逻辑,基本上我恢复了一些UIButtons状态,以及一些其他的小UI更改。在这一点上,我不知道这是否是一个好主意,似乎不是,但如何才能让UI知道消息视图已经消失。当涉及快速响应的UI更改时,NSNotification和KVO似乎不是一个好主意

您可以通过向层发送removeAllAnimations消息来停止层的所有动画

[sel.view removeAllAnimations];

我的建议是创建SimpleMessageViewDelegate协议,该协议具有-(void)messageFinished(或类似的)方法,该方法在消息演示结束时被调用以恢复UI。您还可以在messageFinished结束时设置要执行的块,从而跳过协议和视图中显示消息的不需要的方法。它应该是
self.layer removeAllAnimations]