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的行为。 这是一个在CAMediaTimingCAAnimation符合)上声明的属性。 您应该将其设置为kCAFillModeForwards

随着这两个变化,animation应该在完成之后保持。 但是,我不知道是否需要更改群组中的个人animation或群组中的个人animation,或者两者都有。