我正在尝试绘制一个自定义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];
}
我的方块正确更新。