在CALayer中,drawInContext:被调用但不更新屏幕

时间:2014-06-03 03:09:19

标签: cocoa calayer quartz-2d

我正在尝试绘制一个自定义CALayer,然后将其作为子图层添加到其他位置。自定义CALayer类只有一个变量:

float xScale = 0.5f;

并覆盖drawInContext:方法:

    -(void) drawInContext:(CGContextRef)ctx {

        NSLog(@"Method called with xScale %f", xScale);

        CGContextSetFillColorWithColor(ctx, [NSColor redColor].CGColor);
        CGContextAddRect(ctx, CGRectMake(100 * xScale, 100, 50, 50));
        CGContextFillPath(ctx);
    }

在屏幕上绘制红色方块。当在其他地方的NSView中初始化类时使用:

heartLayer = [[HeartCALayer alloc] init];
heartLayer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
[self.layer addSublayer:heartLayer];
[heartLayer setNeedsDisplay];

正方形绘制在正确的位置。然而,当我然后要求图层重绘

heartLayer.xScale = 1.0f;
[heartLayer setNeedsDisplay];

调用drawInContext:方法,并更新xScale变量,但方块不会更改其位置。我不知道为什么屏幕没有更新。是否将CALayer添加为子图层?图形上下文是否以某种方式无效?它与CALayers的隐式动画有关吗?我到处搜索,我的智慧结束了:(

谢谢,Kenneth


很抱歉回答我自己的问题:也许你会比我浪费更少的时间:

问题是CALayer类的隐式动画。这在thread中进行了讨论。

我将以下覆盖方法添加到自定义CALayer类:

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)key {
    return (id)[NSNull null];
}

我的方块正确更新。

0 个答案:

没有答案