Objective-C-CABasicAnimation在动画之后应用更改吗?

我正在使用CABasicAnimation移动和调整图像视图的大小。我希望将图像视图添加到超级视图中,进行动画处理,然后从超级视图中删除。


为了实现这一点,我正在监听my的委托调用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];


梵蒂冈之花
浏览 665回答 3
3回答

翻过高山走不出你

将动画添加到图层时,该动画不会更改图层的属性。而是,系统创建该层的副本。原始层称为模型层,副本层称为表示层。表示层的属性随动画的进行而变化,但是模型层的属性保持不变。删除动画时,系统将破坏表示层,仅保留模型层,然后模型层的属性将控制该层的绘制方式。因此,如果模型层的属性与表示层属性的最终动画值不匹配,则该层将立即重置为其在动画之前的外观。要解决此问题,您需要将模型图层的属性设置为动画的最终值,然后将动画添加到图层。您要按此顺序进行操作,因为更改图层属性可以为该属性添加隐式动画,这将与您要显式添加的动画冲突。您要确保您的显式动画覆盖隐式动画。那你怎么做这些呢?基本配方如下所示:CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];animation.fromValue = [NSValue valueWithCGPoint:myLayer.position];layer.position = newPosition; // HERE I UPDATE THE MODEL LAYER'S PROPERTYanimation.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];

慕雪6442864

完成后,会自动删除CAAnimations。有一个属性removedOnCompletion对此进行控制。您应该将其设置为NO。此外,还有一个名为的fillMode控件,可以控制动画持续时间之前和之后的行为。这是在上声明的属性CAMediaTiming(CAAnimation符合)。您应该将此设置为kCAFillModeForwards。通过这两个更改,动画应在完成后继续存在。但是,我不知道您是否需要在组中或在组中的单个动画上或同时在两者上进行更改。
打开App,查看更多内容
随时随地看视频慕课网APP