我有自己的最小视图类:
- (void) awakeFromNib
{
NSLog(@"awakeFromNib!");
[self.layer setDelegate:self];
[self.layer setFrame:CGRectMake(30, 30, 250, 250)];
self.layer.masksToBounds = YES;
self.layer.cornerRadius = 5.0;
self.layer.backgroundColor = [[UIColor redColor] CGColor];
[self setNeedsDisplay];
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
NSLog(@"drawing!");
}
drawLayer:inContext永远不会被调用,虽然我可以看到图层为红色圆角矩形。我错过了什么?
编辑:来自Apple docs
您可以为图层绘制内容, 或更好的封装设置 通过创建一个图层的内容图像 委托实现其中一个的类 以下方法:displayLayer: 或drawLayer:inContext:。
实现绘制的委托方法 内容不会自动 导致图层使用它绘制 实现。相反,你必须 明确告诉图层实例 通过重新缓存内容 发送一个setNeedsDisplay或 setNeedsDisplayInRect:message,或者 设置其needsDisplayOnBoundsChange 属于YES。
另外
drawLayer:inContext的:
如果已定义,则由默认实现调用 drawInContext:。
答案 0 :(得分:9)
你永远不应该改变UIView层的委托。从UIView图层属性的文档:
警告:由于视图是图层的 代表,你永远不应该设置 查看另一个CALayer的代表 宾语。此外,你永远不应该 更改此图层的委托。
如果您想在视图中进行自定义绘图,只需覆盖drawRect:方法。
如果您确实想要使用图层,则需要创建自己的图层:
UIView *myView = ...
CALayer *myLayer = [CALayer layer];
myLayer.delegate = self;
[myView.layer addSublayer:myLayer];
在这两种情况下,您都需要在第一种情况下在视图上调用setNeedsDisplay,在第二种情况下调用自定义层。你永远不会直接调用drawRect:或drawLayer:inContext:当你调用setNeedsDisplay时会自动调用它们。
答案 1 :(得分:0)
使用
[self.layer setNeedsDisplay];
代替
[self setNeedsDisplay];
它是view.layer
,而不是view