UIViewanimation块暂停animation和完成代码
我有一个animation块来执行一个简单的转换为基础的animation,完成后从其超视图中删除有问题的视图。
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];}];
然后,我使用http://developer.apple.com/library/ios/#qa/qa1673/_index.html中详细介绍的代码来暂停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; }
但是,此代码不会阻止执行完成代码。 所以为了防止代码执行,我把这个代码修改为:
completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];};
在检查完成时== TRUE防止在animation块暂停时执行完成代码。 如果在“取消暂停”animation之前,持续时间已过时,则完成代码将不会执行。 即在这种情况下,msgView保持在超级视图。
是否有任何暂停/取消暂停与完成代码相关的animation和定时器(如果这是怎么回事)?
正如我在上面的评论中所说,似乎没有问题。 以下是iOS 5.1和6.1的testing。
用UIImageView *transView
和UIButton *trigger
创build故事板。 这是这个class级:
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; }
当您按下触发器button时,animation开始。 再按一次,animation停止。 等待10秒钟,然后再次按下button。 animation继续并完成,并logging“完成”。
- 使用负速度恢复CABasicAnimation?
- 在UIImageView上加上0.3不透明的黑色覆盖
- <CATransformLayer:0x14fea3710> – 在仅变换图层中更改属性masksToBounds将不起作用
- animationAVPlayerLayer videoGravity属性
- 触摸移动在CAShapeLayer绘图慢/ laggy
- CALayer与CGContext,这是一个更好的devise方法?
- UITableViewCell中的CALayer阴影绘制不正确
- 视图的层颜色正在变化时如何使不同的颜色外观
- CALayer – 放置在storyboard UIButton下面的子图层?