代码之家  ›  专栏  ›  技术社区  ›  Pablo

DrawLayer:未调用InContext

  •  3
  • Pablo  · 技术社区  · 14 年前

    我有自己的最小化视图类:

    - (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

    你可以为你的图层绘制内容, 或者更好地封装设置 通过创建一个 委托类,该类实现 以下方法:显示层: 或drawlayer:incontext:。

    实现委托方法以绘制 内容不会自动 使图层使用 实施。相反,你必须 明确告诉层实例 通过以下方式重新缓存内容 发送一个setNeedsDisplay或 setNeedsDisplayInRect:消息,或 设置其需求显示边界更改 属性设置为“是”。

    阿尔索

    Drawlayer:InContext:

    如果已定义,则由默认实现调用 的DrawInContext:。

    1 回复  |  直到 14 年前
        1
  •  9
  •   loomer    14 年前

    您不应该更改uiview层的代理。从uiview层属性文档:

    警告:因为视图是层 委托,您不应该设置 作为另一个Calayer的代表查看 对象。另外,你不应该 更改此层的代理。

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

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

    UIView *myView = ...
    CALayer *myLayer = [CALayer layer];
    myLayer.delegate = self;
    [myView.layer addSublayer:myLayer];
    

    在这两种情况下,您都需要调用setNeedsDisplay,在第一种情况下显示在视图上,在第二种情况下显示在自定义层上。您从不直接调用drawrect:或drawlayer:incontext:,当您调用setneedsDisplay时会自动调用它们。