我有一个动画块进行简单的基于变换的动画,那在完成去除在从它的父问题的图。
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];}];
然后我使用的代码由Tech Q&A 1673,详细http://developer.apple.com/library/ios/#qa/qa1673/_index.html暂停动画。
-(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;
}
但是,此代码不会阻止完成代码的执行。 因此,为了防止代码执行我更改代码完成此:
completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];};
虽然检查成品== TRUE防止而动画块暂停正在执行的完成代码。 如果持续时间现在exceded之前你“取消暂停”的动画,完成代码将不会被执行。 即在这种情况下,msgView留在上海华。
反正是有暂停/恢复双方的动画,并完成代码相关联的定时器(如果这是发生了什么)?
正如我在上面的评论说,似乎没有成为一个问题。 下面是在IOS 5.1和6.1进行测试。
创建一个故事板UIImageView *transView
和UIButton *trigger
。 这里的类:
TSTViewController.h:
@property (weak, nonatomic) IBOutlet UIImageView *transView;
@property (weak, nonatomic) IBOutlet UIButton *trigger;
@property (nonatomic) NSUInteger bState;
- (IBAction)didPressTrigger:(id)sender;
TSTViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
self.bState = 0; // 0 is initial state
// 1 is transform being animated
// 2 is transform paused
// 3 is transform ended
}
- (IBAction)didPressTrigger:(id)sender {
switch (self.bState) {
case 0:
{
CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0);
self.bState++;
[UIView animateWithDuration:5.0
animations:^(void){self.transView.layer.transform = transform;}
completion:^(BOOL finished){
self.bState = 3;
NSLog(@"Done");
}];
break;
}
case 1:
{
self.bState++;
[self pauseLayer:self.transView.layer];
break;
}
case 2:
{
self.bState = 1;
[self resumeLayer:self.transView.layer];
break;
}
case 3:
{
[UIView animateWithDuration:0 animations:^(void){self.transView.layer.transform = CATransform3DIdentity;}
completion:^(BOOL finished) {
self.bState = 0;
NSLog(@"Reset");
}];
break;
}
default:
break;
}
}
-(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;
}
当您按下快门释放按钮时,动画启动。 再次按下它,动画停止。 等待10秒,再次按下按钮。 动画将继续并完成,而且记录“完成”。