CALayer委托方法drawLayer没有被调用

13 iphone core-animation quartz-graphics

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

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

有关什么阻止我的图层绘制方法drawLayer:inContext:被调用的任何建议?

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

ama*_*ttn 23

drawLayer:inContext:如果您的框架是CGRectZero或屏幕外,将不会被调用.此外,如果您的CALayer未附加到现有的屏幕图层,则无论您拨打多少次,它都不会绘制setNeedsDisplay


win*_*son 17

实现空 drawRect:

- (void)drawRect:(CGRect)rect {
}
Run Code Online (Sandbox Code Playgroud)

取自ZoomingPDFViewer项目: -

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


her*_*ube 7

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


per*_*age 5

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

从iOS CALayer文档:

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

  • 据推测"与UIView对象相关联"意味着该层是视图的根层(由`layer`属性引用).对于UIView根层的子层,委托肯定不是视图对象. (4认同)