【问题标题】:drawLayer:inContext is not calleddrawLayer:inContext 没有被调用
【发布时间】:2010-10-27 13:33:31
【问题描述】:

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

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

您可以为图层绘制内容, 或更好地封装设置 通过创建一个图层的内容图像 实现其中之一的委托类 以下方法: displayLayer: 或 drawLayer:inContext:.

实现一个委托方法来绘制 内容不会自动 使图层使用它进行绘制 执行。相反,您必须 明确告诉图层实例 重新缓存内容,或者通过 向其发送 setNeedsDisplay 或 setNeedsDisplayInRect:消息,或通过 设置其需求DisplayOnBoundsChange 属性为 YES。

还有

drawLayer:inContext:

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

【问题讨论】:

    标签: iphone core-animation core-graphics


    【解决方案1】:

    你不应该改变 UIView 的层的委托。来自 UIView 层属性的文档:

    警告:由于视图是图层的 委托,你不应该设置 作为另一个 CALayer 的代表查看 目的。此外,您永远不应该 改变这一层的委托。

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

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

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

    在这两种情况下,您需要在第一种情况下在视图上调用 setNeedsDisplay,在第二种情况下在您的自定义层上调用。您永远不会直接调用 drawRect: 或 drawLayer:inContext:,它们会在您调用 setNeedsDisplay 时自动调用。

    【讨论】:

      【解决方案2】:

      使用

      [self.layer setNeedsDisplay];

      而不是

      [self setNeedsDisplay];


      这是view.layer,而不是view

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多