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

时间:2018-08-23 14:44:52

标签: cocoa calayer nsview drawrect

根据NSView drawRect:的文档

  

如果您的应用改为使用其图层对象管理内容,请使用updateLayer方法更新您的图层,而不是覆盖此方法。

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

当然,如果我使包含视图不支持图层,则当窗口处于活动状态或非活动状态时都会进行更新。

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

谢谢。

编辑2018年8月25日:

看来,诀窍是将层次结构中的一个视图设置为[view setCanDrawSubviewsIntoLayer:YES,根据文档,该视图使用所有子视图的drawRect:将其图形添加到其自己的图层。但是,这似乎仅在10.13版本中有效,并且在10.14 beta版中已被打破。除非这是一个10.14 beta错误,否则我将继续寻找可能的API更改。

由于该问题仍未解决,因此尚未真正解决。

1 个答案:

答案 0 :(得分:1)

没有覆盖-wantsUpdateLayer返回true的层支持的视图仍然使用-drawRect:进行绘制。您引用的文档有点用“应该”来表示“应该,以获得最佳性能”。不需要,只是推荐。

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

我怀疑当您的视图没有分层支持时它起作用的原因是您将视图标记为需要更新。由于非图层支持的视图使用painter模型(从后到前)绘制到窗口的后备存储中,因此,如果您重新绘制视图,则任何子视图都必须在视图的顶部重绘自己。

如果在窗口的键/主要状态更改时需要重新绘制框架的视图,则它们应观察相关的通知并将其自身设置为需要显示。如果他们不这样做,那就是框架错误。您可以通过将其标记为需要自己显示来解决此问题。