Layer-Backed NSControl仍然调用NSCell绘图例程

时间:2018-06-11 17:53:38

标签: objective-c cocoa calayer appkit nscontrol

上下文:

Apple在macOS上有“软弃用”的NSCell。我正在尝试减少在我的自定义NSControl子类中使用它,而是使用CALayers来处理我的绘图。为此,我使我的NSButton子类层支持:

self.wantsLayer = YES;

然后我尝试使用“updateLayer”路径而不是“drawRect”来处理我的绘图:

- (BOOL) wantsUpdateLayer {
    return YES;
}

- (void) updateLayer { 
     // Change layer background/border colors if pressed, disabled, etc.
     // Change text color of a CATextLayer sublayer for button's title. 
}

问题:

如果我使用-updateLayer,NSCell仍会收到绘图命令并绘制其标题,导致我的控件中出现“模糊”的标题字符串,因为字符串在textLayer中被绘制两次,一次被细胞

但是,如果我在-drawRect:而不是-updateLayer执行与上述完全相同的工作,那么单元格不会执行任何绘图(因为我不会使用{{{ 1}})

在我的生活中,我无法弄清楚当关联的controlView(我的按钮子类)选择加入[self.cell drawInteriorWithFrame:ControlView:]而不是-updateLayer时触发单元格绘制的内容。

我已经查看了NSControl.h和NSView.h上的所有方法。我已经覆盖了所有-drawRect:和相关的方法。这些都不是罪魁祸首。我不能简单地设置-updateCell,因为NSControl仍然依赖于NSCell进行事件处理等。

有人可以告诉我如何在关联的controlView使用self.cell=nil而不是-updateLayer时停止绘制NSCell吗?

1 个答案:

答案 0 :(得分:2)

-[NSButtonCell layoutLayerWithFrame:inView:]中,单元格会添加NSTextField来绘制标题。覆盖titleRectForBounds:并返回NSZeroRect以删除标题。