gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:28:51 28 4
gpt4 key购买 nike

我正在使用 CABasicAnimation 来移动和调整 ImageView 的大小。我希望将 ImageView 添加到 super View 、动画,然后从 super View 中删除。

为了实现这一点,我正在监听我的 CAAnimationGroup 的委托(delegate)调用,并且一旦它被调用,我就会从 super View 中删除 ImageView 。

问题是有时图像在从 super View 中删除之前会在初始位置闪烁。避免这种行为的最佳方法是什么?

CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, opacityAnim, nil];
animGroup.duration = .5;
animGroup.delegate = self;
[imageView.layer addAnimation:animGroup forKey:nil];

最佳答案

当您向图层添加动画时,该动画不会更改图层的属性。相反,系统会创建图层的副本。原始层称为模型层,复制层称为表示层。表示层的属性随着动画的进行而变化,但模型层的属性保持不变。

当您删除动画时,系统会破坏表示层,只留下模型层,然后模型层的属性控制层的绘制方式。因此,如果模型层的属性与表示层属性的最终动画值不匹配,该层将立即重置为动画之前的外观。

要解决这个问题,您需要将模型层的属性设置为动画的最终值,然后然后将动画添加到层中。您希望按此顺序执行此操作,因为更改图层属性可以为该属性添加 隐式 动画,这会与您要显式添加的动画冲突。您要确保显式动画覆盖隐式动画。

那么你是如何做到这一切的呢?基本配方如下所示:

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:] 方法为一个或多个动画设置完成处理程序比尝试使用动画的委托(delegate)更容易。您设置事务的完成 block ,然后添加动画:

[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
[self.imageView removeFromSuperview];
}];
[self addPositionAnimation];
[self addScaleAnimation];
[self addOpacityAnimation];
} [CATransaction commit];

关于Objective-C - CABasicAnimation 在动画后应用更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515647/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com