14

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

但由于某种原因,drawLayer:inContext:方法永远不会被调用。而actionForLayer:forKey:委托方法确实被调用,这意味着委托正在layer.delegate = self对象的 init 方法中正确设置。

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

我被称为[layer setNeedDisplay]经常。所以我想这是一些基本错误。

4

5 回答 5

24

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

于 2009-07-30T20:24:48.307 回答
17

实现一个空drawRect:

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

取自ZoomingPDFViewer项目:-

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

于 2011-08-25T23:57:59.953 回答
7

setNeedsDisplay必须调用图层对象。简单地将图层添加为子图层并不能为您做到这一点。这是从 Ray Wenderlich 的CALayer 教程中得到的。

于 2012-02-01T18:27:39.063 回答
5

如果您最终将 CALayer 与 UIView 一起使用,则委托必须是视图对象本身:

来自 iOS CALayer 文档:

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

于 2010-11-11T16:22:16.880 回答
2

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

于 2014-05-27T16:07:09.887 回答