如何在更改其边界的动画期间强制重绘CALayer

时间:2012-12-17 15:07:44

标签: macos cocoa core-animation

我有一个图层托管NSView。在其中我有一个包含drawInContext方法的CALayer。 needsDisplayOnBoundsChange参数设置为true,如果我调整视图大小,那么图层确实会在动画期间正确调整大小并重新绘制。

但是,我想独立于视图设置图层的大小。我可以设置动画来执行此操作,但在动画期间不会重绘图层。相反,似乎是为开始帧和结束帧拍摄了一个快照,而另一帧则逐渐消失。更糟糕的是,随着动画的进行,两个图像都被扭曲到调整大小帧中。

如何在调整大小动画期间强制CALayer重绘自己?

谢谢,

1 个答案:

答案 0 :(得分:0)

这可能太旧了,但解决方案不应该太难。我不知道是否有更好的方法,但您可以使用CADisplayLink设置您的图层需要重绘。

- (void)updateContinuously
{
    if(!self.displayLink) {
        self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateLayer)];
        [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    }
}

- (void)stopUpdatingContinuously
{
    [self.displayLink invalidate];
    self.displayLink = nil;
}

- (void)update
{
    // This will fire every time when the display is redrawn
    [self setNeedsDisplay];
}

- (void)updateContinuouslyForTime:(NSTimeInterval)seconds
{
    // Create an NSTimer that will remove the displayLink when the time is over
    NSTimer *stopTimer = [NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(stopUpdatingContinuously) userInfo:nil repeats:NO];
    [[NSRunLoop mainRunLoop] addTimer:stopTimer forMode:NSRunLoopCommonModes];
}