1
votes

I am not much into iOS animation. What I am trying to achieve is a simple message view that slide vertical from bottom of screen to a given y, then after few instants the UIView rollback in vertical to go off screen.

[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...
                                          }
                          ];
                     }
                 }  ];

This is working fine, but I am having a problem using this mechanism in a iOS UITabBar application: when I change tab, the animation stop, I can infact see that "finished" completion is "false". Therefore the second block is not called, and the message view stays on.

Here are the questions:

  • my first concern is to understand if the code I have written is correct, regarding the nested animations.
  • I could solve by ignoring 'finished' and execute code anyway, but I don't feel it is a good idea
  • within the last completion block, I have put some programming logic, basically I am restoring few UIButtons state, and some other little UI change. At this point I don't know if it is a good idea, it seems not, but how can let the UI knows that the message view has disappeared. NSNotification and KVO seems a bad idea when fast responsive UI change are involved.
1
My suggestion is to create SimpleMessageViewDelegate protocol, which has -(void)messageFinished (or something like that) method which is called at the end of the message presentation to restore UI. You could also go with setting the block to be executed at the end of messageFinished, thereby skipping the protocol, and unneeded methods in view presenting the message.Dobroćudni Tapir

1 Answers

-3
votes

You can stop all animations for a layer by sending the layer a removeAllAnimations message.

[sel.view removeAllAnimations];