【问题标题】:Cannot animate CALayer strokeColor无法为 CALayer strokeColor 设置动画
【发布时间】:2013-04-18 09:02:31
【问题描述】:

我一直在尝试绘制一个简单的矩形并为边缘颜色设置动画。我尝试使用following 链接,但仍然没有帮助。我最终通过更改图层的边框颜色和动画来修复它。效果很好。

strokeColor 是否有 KVO,因为我正在让它为层的 backgroundColor 工作。

我在 XCode 4.6 上运行 iOS SDK 6.1

这就是我一直在做的:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

CABasicAnimation *strokeAnim = [CABasicAnimation animationWithKeyPath:@"strokeColor"];
strokeAnim.fromValue         = (id) [UIColor redColor].CGColor;
strokeAnim.toValue           = (id) [UIColor greenColor].CGColor;
strokeAnim.duration          = 3.0;
strokeAnim.repeatCount       = 0;
strokeAnim.autoreverses      = YES;
[self.layer addAnimation:strokeAnim forKey:@"animateStrokeColor"];

CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, squareLength, 0);
CGContextAddLineToPoint(context, squareLength, squareLength);
CGContextAddLineToPoint(context, 0, squareLength);
CGContextAddLineToPoint(context, 0, 0);
CGContextStrokePath(context);

【问题讨论】:

  • 等等,你是在drawRect里面添加动画吗? ????

标签: ios calayer


【解决方案1】:

tl;dr;你的意思可能是@"borderColor"


除非您确实在视图中覆盖了+ (Class)layerClass(我怀疑您是否这样做了),否则您的视图层将是一个没有strokeColor 属性的CALayer 实例。

您可以使用 CAShapeLayer,但您不应该仅仅为了中风而这样做,因为 CALayer 具有 borderColor 属性,这可能是您正在寻找的。

所以我的建议是为 borderColor 设置动画。


与您的问题无关:

从您发布的代码看来,您正在将动画添加到您的视图drawRect: 实现中。此方法仅应用于实际绘图,我强烈建议您将动画代码移至其他位置。每次您的视图重绘自身时都会调用此方法,这对于添加新动画来说可能过于频繁。

【讨论】:

    【解决方案2】:

    在研究了同样的问题后,我发现strokeColor 不是CALayer 上的动画属性。我认为这与 CALayer 渲染到缓存位图有关。

    解决方案是使用CAShapeLayer 代替strokeColor 动画。

    【讨论】:

    • "...strokeColor 不是 CALayer 上的动画属性..."具有误导性。并不是说它在 CALayer 上不能动画。就是这个属性在 CALayer 上根本不存在。
    • 确定是因为 CALayer 被渲染为位图吗?我很想看到该声明的一些参考。
    • @DavidRönnqvist - 我当然不是 CA 专家 - 很高兴被证明是错误的。我正在阅读我在 Nick Lockwood 的“iOS 核心动画:高级技术”中读到的内容 - 有问题的页面:CAShapeLayer
    • 对不起。我可能在那个评论中太含糊了。我的意思是:你确定 CALayer 没有 strokeColor 属性的原因与它被渲染到缓存的位图有关吗?这是否也意味着 CAShapeLayer 没有缓存位图,因为它具有 strokeColor 属性?幕后有缓存是正确的,但在这种情况下这是一个实现细节,我认为 CALayer 及其子类之间没有任何不同。这一切都归结为命名。 …
    • ... 路径被描边,因此形状图层具有配置描边的属性,但常规图层始终是矩形,因此它具有边框属性,因为该名称在矩形的上下文中更有意义。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2021-06-25
    相关资源
    最近更新 更多