【问题标题】:Can I force CALayer to use setNeedsDisplayInRect: rather than setNeedsDisplay for custom property我可以强制 CALayer 使用 setNeedsDisplayInRect: 而不是 setNeedsDisplay 作为自定义属性吗
【发布时间】:2012-03-08 06:13:40
【问题描述】:

我有自定义属性,我覆盖 +needsDisplayForKey: 以为此属性返回 YES。 我的-drawInContext: 方法非常复杂,而受我的自定义属性影响的矩形非常小。我想优化一下。

我正在考虑的解决方案是实现自定义设置器,我将在其中明确标记要显示的受影响矩形。我不确定的一件事是这样的实现将等于原始实现并且将处理隐式动画。 (rdar://11008555)

它会相等还是有更好的解决方案? (目标平台为 10.6+)

【问题讨论】:

    标签: macos cocoa core-animation calayer


    【解决方案1】:

    无法在CALayer 的一部分上绘图。核心动画层被实现为 OpenGL 表面上的纹理。当您实现自定义绘图时,实际上发生的情况是您的绘图命令用于构建位图,然后将该位图设置为 CALayer 的 OpenGL 表面的纹理。

    您可以自己管理图层的位图缓存(使用NSImageCGContext)。这样你就可以只修改需要重绘的位图部分,然后使用setContents:将图像绘制到图层。

    【讨论】:

    • CALayers 将其绘制的内容缓存在contents 属性中。完全有理由期望 UIView-drawInRect: 是通过在调用此方法之前首先将先前缓存的内容绘制到新上下文中来实现的(假设给定的 rect 没有覆盖整个视图)。
    • 是的,这完全有可能。你基本上会在这里为CALayer 做同样的事情。 CALayerUIViewNSView 轻得多,所以你需要自己管理。
    • 只是为了确保我理解你所说的:我不能像为 NSView (Draw Minimally) 那样使用 CGContextGetClipBoundingBox(aContext) 来选择要绘制的 prtions 来检查脏矩形的交集。相反,我应该始终执行所有绘图例程,或者将先前调用此方法的结果缓存到 NSImage 中,并使用CGContextGetClipBoundingBox(aContext) 手动使部分无效和更新。对吗?
    • @Kentzo:抱歉,我的评论是基于 iOS 的(特别是 UIView-drawInRect: 方法)。我只能猜测您可以在 OS X 中完成类似的操作。无论如何,我只是指出您仍然可以在 CoreAnimation 中通过缓存先前绘制的图像来实现部分重绘行为,直到您绘制新图像之后。我对实际问题一无所知,即是否使 +needsDisplayForKey: 之外的矩形无效保留了动画支持。
    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 2017-06-26
    • 1970-01-01
    • 2020-11-07
    • 2011-07-08
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多