Objective-C – animation之后应用更改的CABasicAnimation?
我正在使用CABasicAnimation
来移动和调整图像视图。 我想将图像视图添加到超级视图,animation,然后从超级视图中删除。
为了实现我正在侦听我的CAAnimationGroup
委托调用,一旦它被调用,我从超级视图中删除图像视图。
问题是,有时图像在从超级视图中移除之前在初始位置闪烁。 什么是避免这种行为的最好方法?
CAAnimationGroup *animGroup = [CAAnimationGroup animation]; animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, opacityAnim, nil]; animGroup.duration = .5; animGroup.delegate = self; [imageView.layer addAnimation:animGroup forKey:nil];
将animation添加到图层时,animation不会更改图层的属性。 相反,系统会创build该图层的副本。 原始图层称为模型图层,副本称为表示图层。 表示层的属性随着animation的进展而改变,但是模型层的属性保持不变。
当您删除animation时,系统将销毁表示层,仅留下模型图层,然后模型图层的属性将控制图层的绘制方式。 因此,如果模型图层的属性与表示图层属性的最终animation值不匹配,则该图层将在animation之前立即重置为其外观。
要解决这个问题,需要将模型图层的属性设置为animation的最终值, 然后将animation添加到图层。 您希望按照此顺序执行此操作,因为更改图层属性可以为属性添加隐式animation,这会与要显式添加的animation冲突。 你想确保你的显式animation覆盖隐式animation。
那么你怎么做这一切? 基本的配方如下所示:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; animation.fromValue = [NSValue valueWithCGPoint:myLayer.position]; layer.position = newPosition; // HERE I UPDATE THE MODEL LAYER'S PROPERTY animation.toValue = [NSValue valueWithCGPoint:myLayer.position]; animation.duration = .5; [myLayer addAnimation:animation forKey:animation.keyPath];
我没有使用animation组,所以我不知道你可能需要改变。 我只是分别添加每个animation到图层。
我还发现使用+[CATransaction setCompletionBlock:]
方法为一个或多个animation设置完成处理程序更简单,而不是试图使用animation的委托。 您设置事务的完成块,然后添加animation:
[CATransaction begin]; { [CATransaction setCompletionBlock:^{ [self.imageView removeFromSuperview]; }]; [self addPositionAnimation]; [self addScaleAnimation]; [self addOpacityAnimation]; } [CATransaction commit];
完成后,CAAnimations会自动删除。 有一个属性removedOnCompletion
控制这个。 你应该把它设置为NO
。
此外,还有一个称为fillMode
控件,它在持续时间之前和之后控制animation的行为。 这是一个在CAMediaTiming
( CAAnimation
符合)上声明的属性。 您应该将其设置为kCAFillModeForwards
。
随着这两个变化,animation应该在完成之后保持。 但是,我不知道是否需要更改群组中的个人animation或群组中的个人animation,或者两者都有。