框架使用 drawRect:;我需要在层支持的 NSView 上使用它。如何更新?

Framework uses drawRect:; I need to use it on a layer-backed NSView. How to update?

根据 NSView 的文档drawRect:

If your app manages content using its layer object instead, use the updateLayer method to update your layer instead of overriding this method.

我有一个 NSView,带有框架提供的子视图,它们都使用 drawRect: 绘制。这个框架提供的视图是 NSView 的子视图,我需要一个图层。因为我的框架提供的视图是层支持视图的后代,所以通常不会调用 drawRect:,尤其是在 window 处于活动或非活动状态的情况下(视图需要更新以反映它的(处于)活动状态。

当然,如果我使我的包含视图不支持图层,则更新会在 window 处于活动状态或非活动状态时发生。

在不将框架修改为自定义分支的情况下,确保 drawRect: 在我的框架提供的视图中需要时出现的最佳途径是什么?

谢谢。

编辑 2018 年 8 月 25 日:

看起来诀窍是将层次结构中的视图之一设置为,例如 [view setCanDrawSubviewsIntoLayer:YES,根据文档,它使用所有子视图的 drawRect: 来添加它们的绘图到它自己的层。然而,这似乎只适用于 10.13,并且在 10.14 测试版中被打破。我将继续寻找潜在的 API 更改,除非这是 10.14 beta 错误。

由于问题还没有解决,所以还没有真正回答。

不覆盖 -wantsUpdateLayer 到 return true 的图层支持视图仍然使用 -drawRect: 绘制自己。您引用的部分文档使用 "should" 来表示 "should, for best performance,"。不是必须的,只是推荐的。

视图通常不会仅仅因为包含 window 改变了关键或主要状态而重绘自己。您必须将它们标记为需要显示。或者框架应该这样做。

我怀疑它在您的视图不受图层支持时起作用的原因是您将视图标记为需要更新。由于非图层支持的视图使用画家模型(从后到前)绘制到 window 的后备存储中,如果您的视图自行重绘,则任何子视图都必须在您的视图绘图之上重绘自己。

如果框架的视图在window的key/main状态改变时需要重绘,那么他们应该观察相关通知并将自己设置为需要显示。如果他们不这样做,那就是框架错误。您可以通过将它们标记为需要自己显示来解决此问题。