3 回答
TA贡献1875条经验 获得超3个赞
将动画添加到图层时,该动画不会更改图层的属性。而是,系统创建该层的副本。原始层称为模型层,副本层称为表示层。表示层的属性随动画的进行而变化,但是模型层的属性保持不变。
删除动画时,系统将破坏表示层,仅保留模型层,然后模型层的属性将控制该层的绘制方式。因此,如果模型层的属性与表示层属性的最终动画值不匹配,则该层将立即重置为其在动画之前的外观。
要解决此问题,您需要将模型图层的属性设置为动画的最终值,然后将动画添加到图层。您要按此顺序进行操作,因为更改图层属性可以为该属性添加隐式动画,这将与您要显式添加的动画冲突。您要确保您的显式动画覆盖隐式动画。
那你怎么做这些呢?基本配方如下所示:
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];
我没有使用动画组,所以我不完全知道您可能需要更改什么。我只是将每个动画分别添加到图层。
我还发现使用该+[CATransaction setCompletionBlock:]方法为一个或多个动画设置完成处理程序比尝试使用动画的委托更容易。设置事务的完成块,然后添加动画:
[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
[self.imageView removeFromSuperview];
}];
[self addPositionAnimation];
[self addScaleAnimation];
[self addOpacityAnimation];
} [CATransaction commit];
TA贡献1812条经验 获得超5个赞
完成后,会自动删除CAAnimations。有一个属性removedOnCompletion
对此进行控制。您应该将其设置为NO
。
此外,还有一个名为的fillMode
控件,可以控制动画持续时间之前和之后的行为。这是在上声明的属性CAMediaTiming
(CAAnimation
符合)。您应该将此设置为kCAFillModeForwards
。
通过这两个更改,动画应在完成后继续存在。但是,我不知道您是否需要在组中或在组中的单个动画上或同时在两者上进行更改。
- 3 回答
- 0 关注
- 664 浏览
添加回答
举报