CALayer委托方法drawLayer没有被调用

发布于 2024-07-30 07:13:20 字数 383 浏览 4 评论 0原文

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

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

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

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

My object a sub class of NSObject has CALayer instance variable. I use it for drawing and caching content with its delegate set to my object.

But for some reason drawLayer:inContext: method NEVER gets called. Whereas actionForLayer:forKey: delegate method does get called implying the delegate is getting set properly with layer.delegate = self in the object's init method.

Any suggestions on what is preventing my layer drawing method drawLayer:inContext: from getting called ?

I am called the [layer setNeedDisplay] often. So I guess it is some fundamental error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

·深蓝 2024-08-06 07:13:20

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

来自 iOS CALayer 文档:

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

If you're eventually using the CALayer with a UIView then the delegate must be the view object itself:

From the iOS CALayer documentation:

"In iOS, if the layer is associated with a UIView object, this property must be set to the view that owns the layer."

多孤肩上扛 2024-08-06 07:13:20

必须调用图层对象的setNeedsDisplay。 简单地将图层添加为子图层并不适合您。 这是从 Ray Wenderlich 的 CALayer 教程 获得的。

The layer object's setNeedsDisplay must be called. Simply adding the layer as a sublayer does not do that for you. Got this from Ray Wenderlich's CALayer tutorial.

拥有 2024-08-06 07:13:20

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

drawLayer:inContext: won't get called if your frame is CGRectZero or offscreen. Also, if your CALayer isn't attached to an existing onscreen layer, it will never draw, no matter how many times you call setNeedsDisplay

探春 2024-08-06 07:13:20

实现一个空的drawRect:

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

取自ZoomingPDFViewer项目:-

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

内部

Implement an empty drawRect:

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

Taken from the ZoomingPDFViewer project:-

UIView uses the existence of -drawRect: to determine if it should
allow its CALayer to be invalidated, which would then lead to the
layer creating a backing store and -drawLayer:inContext: being
called. By implementing an empty -drawRect: method, we allow UIKit
to continue to implement this logic, while doing our real drawing work
inside of -drawLayer:inContext:

你穿错了嫁妆 2024-08-06 07:13:20

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

If you have a multi-threaded app where background processing drives the need to update the CALayer, you must call setNeedsDisplay in the main thread

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文