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

Posted

技术标签:

【中文标题】如何在更改其边界的动画期间强制重绘 CALayer【英文标题】:How to force redraw of a CALayer during an animation that changes its bounds 【发布时间】:2012-12-17 15:07:43 【问题描述】:

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

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

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

谢谢,

提姆

【问题讨论】:

【参考方案1】:

这可能太旧了,但解决方案应该不会太难。我不知道是否有更好的方法,但您可以使用 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];

【讨论】:

以上是关于如何在更改其边界的动画期间强制重绘 CALayer的主要内容,如果未能解决你的问题,请参考以下文章

动画边界更改时具有 CALayer 有线效果的自定义视图

动画边界更改时具有 CALayer 有线效果的自定义视图

图像更改 CALayer 核心动画

在 NSView 边界更改中托管的 CALayer

将 CALayer 添加到 UIView 并能够在方向更改时重绘

在自定义属性更改时重绘自定义 CALayer 子类