CALayer 和 drawRect

Posted

技术标签:

【中文标题】CALayer 和 drawRect【英文标题】:CALayer and drawRect 【发布时间】:2012-08-20 10:26:16 【问题描述】:

我对 Core Animation、CALayer 和所有这些东西完全陌生,所以请耐心等待。 我有一个自定义 NSTextField 用作标签。我希望内容对其位置进行动画处理,因此如果对于标签宽度而言它太长,则整个字符串都是可见的。 现在,动画本身运行良好。我已经用 CABasicAnimation 实现了这个:

- (void)awakeFromNib     
    CALayer *newLayer = [CALayer layer];

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    [animation setFromValue:[NSValue valueWithPoint:NSMakePoint(0, 0)]];
    [animation setToValue:[NSValue valueWithPoint:NSMakePoint(-self.attributedStringValue.size.width, 0)]];
    [animation setDuration:5.0];
    [animation setRepeatCount:HUGE_VAL];

    [newLayer addAnimation:animation forKey:@"position"];

    [self setLayer:newLayer];
    [self setWantsLayer:YES];


唯一的问题是,drawRect: 方法只绘制屏幕上的内容。 所以我想我会覆盖 drawRect: 方法来绘制整个属性字符串。但是,如果我这样做,则根本不会绘制任何内容... 谁能指出我正确的方向?

谢谢!

【问题讨论】:

【参考方案1】:

一般来说,您希望尽可能避免覆盖 drawRect,特别是对于您正在制作动画的 CALayer 对象。这往往会导致非常糟糕的表现。

“drawRect: 方法只绘制屏幕上的内容”是什么意思?

它只绘制当前可见的字符串部分?

【讨论】:

是的,这就是我的意思。它是用dirtyRect绘制的,就是可见的rect 我刚刚用 CATextLayer 试了一下。相同的行为,仅绘制屏幕上可见的内容。【参考方案2】:

我最终使用了 NSTimer。不是最漂亮的解决方案,但至少它有效。

【讨论】:

以上是关于CALayer 和 drawRect的主要内容,如果未能解决你的问题,请参考以下文章

UIView和CALayer的选择

CGLayer和CALayer有啥区别和兼容性?

什么是 CALayer 和 CAGradientLayer?

UIView和CALayer

UIView与CALayer的区别

UIView和CALayer