在 CABasicAnimation 中闪烁以进行旋转

Posted

技术标签:

【中文标题】在 CABasicAnimation 中闪烁以进行旋转【英文标题】:Flickering in CABasicAnimation for rotation 【发布时间】:2015-06-23 17:37:30 【问题描述】:

每当按下按钮时,我都会尝试将 CAShapeLayer 从其当前角度旋转一个角度。

我使用委托函数 animationDidStop 在动画结束时设置图层的变换,因为我注意到动画只改变表示层的变换,而不是图层本身。

但是动画中有随机闪烁,这似乎是在动画结束时动画完成时,由于在委托函数animationDidStop中更新变换之前图层返回到其先前的变换。如何消除闪烁?

@implementation ViewController

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag

    [CATransaction begin];
    [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
    self.parentLayer.transform = CATransform3DRotate(self.parentLayer.transform, DEG2RAD(60.0), 0, 0, 1);
    [CATransaction commit];


- (IBAction)rotateBySixtyPressed:(id)sender 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    animation.duration = 3.0;
    animation.byValue = [NSNumber numberWithFloat:DEG2RAD(60.0)];
    [animation setDelegate:self];
    [self.parentLayer addAnimation:animation forKey:animation.keyPath];

【问题讨论】:

【参考方案1】:

我已经通过这个博客解决了这个问题:http://oleb.net/blog/2012/11/prevent-caanimation-snap-back/ 和这个答案https://***.com/a/7690841/3902153

我不再使用委托函数了。

- (IBAction)rotateBySixtyPressed:(id)sender 
    CATransform3D old_transform = self.parentLayer.transform;
    self.parentLayer.transform = CATransform3DRotate(self.parentLayer.transform, DEG2RAD(60.0), 0, 0, 1);
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    animation.fromValue = [NSValue valueWithCATransform3D:old_transform];
    animation.duration = 3.0;
    [self.parentLayer addAnimation:animation forKey:@"transform"];

【讨论】:

以上是关于在 CABasicAnimation 中闪烁以进行旋转的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIView 属性不使用 CABasicAnimation 进行动画处理

如何在动画CABasicAnimation时改变速度

CABasicAnimation使用总结

使用 CAAnimationGroup 对两个核心动画进行分组会导致一个 CABasicAnimation 无法运行

Swift : 为 CALayer 暂停 CABasicAnimation

CABasicAnimation 执行不可靠