我的对象NSObject的子类有CALayer实例变量。我将它用于绘制和缓存内容,并将其委托设置为我的对象。
但由于某种原因,drawLayer:inContext:
方法永远不会被调用。虽然actionForLayer:forKey:
委托方法被调用,暗示委托在对象的init方法中使用layer.delegate = self
正确设置。
有关阻止我的图层绘制方法drawLayer:inContext:
被阻止的内容的任何建议吗?
我经常被称为[layer setNeedDisplay]
。所以我想这是一个根本性的错误。
答案 0 :(得分:22)
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