I have an animation block to perform a simple transform based animation, that on completion removes the view in question from its superview.
UIView *msgView = [[UIView alloc] initWithFrame:CGRectMake(160, 120, 160, 100)];
// Do stuff to set up the subviews of msgView.
// Add the msgView to the superview (ViewController) that is going to display it.
CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0);
[UIView animateWithDuration:5.0
animations:^(void){msgView.layer.transform = transform;}
completion:^(BOOL finished){[msgView removeFromSuperview];}];
I then use the code as detailed by Tech Q&A 1673 http://developer.apple.com/library/ios/#qa/qa1673/_index.html to pause the animation.
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
However, this code does not prevent the completion code from executing. So to prevent the code from executing I change the code for completion to this:
completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];};
Whilst checking for finished == TRUE prevents the completion code from being executed whilst the animation block is paused. If the duration time is now exceded before you "unpause" the animation, the completion code will not be executed. ie In this case the msgView remains in the superview.
Is there anyway to pause/unpause both the animation and the timer associated with the completion code (if that's what's going on)?