Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone drawLayer:未调用inContext_Iphone_Core Animation_Core Graphics - Fatal编程技术网

Iphone drawLayer:未调用inContext

Iphone drawLayer:未调用inContext,iphone,core-animation,core-graphics,Iphone,Core Animation,Core Graphics,我有一个自己的最小视图类: - (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.backgr

我有一个自己的最小视图类:

- (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从未被调用,尽管我可以看到该层是红色的圆角矩形。我错过了什么

编辑:来自苹果文档

可以为图层绘制内容, 或者更好地封装设置 通过创建 实现以下操作之一的委托类: 以下方法:displayLayer: 或绘图层:inContext:

实现委托方法进行绘图 内容不会自动更新 使用该选项绘制图层 实施相反,你必须 显式地告诉层实例 通过以下方式重新缓存内容: 发送设置需要显示或 setNeedsDisplayInRect:消息,或通过 设置其需要显示BoundSchange 属性设置为“是”

drawLayer:inContext:

如果已定义,则由默认实现调用 文本的类型:


决不应更改UIView图层的委托。从UIView图层特性的文档中:

警告:由于视图是图层的 代理,您不应该设置 作为其他CALayer的代理查看 对象此外,你不应该 更改此图层的代理

如果要在视图中进行自定义绘图,只需覆盖drawRect:方法

如果确实要使用图层,则需要创建自己的图层:

UIView *myView = ...
CALayer *myLayer = [CALayer layer];
myLayer.delegate = self;
[myView.layer addSublayer:myLayer];
在这两种情况下,第一种情况下需要在视图上调用setNeedsDisplay,第二种情况下需要在自定义图层上调用setNeedsDisplay。您从不直接调用drawRect:或drawLayer:inContext:,当您调用setNeedsDisplay时会自动调用它们。

使用

[self.layer setNeedsDisplay]

而不是

[自设置需要显示]


它是
视图。层
,而不是
视图