CALayer委托方法drawLayer没有被调用

时间:2009-07-30 18:00:12

标签: iphone core-animation quartz-graphics

我的对象NSObject的子类有CALayer实例变量。我将它用于绘制和缓存内容,并将其委托设置为我的对象。

但由于某种原因,drawLayer:inContext:方法永远不会被调用。虽然actionForLayer:forKey:委托方法被调用,暗示委托在对象的init方法中使用layer.delegate = self正确设置。

有关阻止我的图层绘制方法drawLayer:inContext:被阻止的内容的任何建议吗?

我经常被称为[layer setNeedDisplay]。所以我想这是一个根本性的错误。

5 个答案:

答案 0 :(得分:22)

如果您的框架是CGRectZero或屏幕外,

drawLayer:inContext:将不会被调用。此外,如果您的CALayer未附加到现有的屏幕图层,则无论您拨打多少次setNeedsDisplay

,它都不会被绘制

答案 1 :(得分:17)

实施空drawRect:

- (void)drawRect:(CGRect)rect {
}

取自 ZoomingPDFViewer 项目: -

  

UIView使用-drawRect:的存在来确定它是否应该   允许其CALayer无效,然后导致   图层创建后备存储并且-drawLayer:inContext:正在存在   调用。通过实现空-drawRect:方法,我们允许UIKit   继续实施这个逻辑,同时做我们真正的绘图工作   在-drawLayer:inContext:

答案 2 :(得分:7)

必须调用图层对象setNeedsDisplay。简单地将图层添加为子图层并不适合您。来自Ray Wenderlich的CALayer tutorial

答案 3 :(得分:5)

如果你最终使用带有UIView的CALayer,那么委托必须是视图对象本身:

从iOS CALayer文档:

“在iOS中,如果图层与UIView对象相关联,则必须将此属性设置为拥有该图层的视图。”

答案 4 :(得分:1)

如果你有一个多线程应用程序,后台处理需要更新CALayer,你必须在主线程中调用setNeedsDisplay