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吗?
答案 0 :(得分:2)
在-[NSButtonCell layoutLayerWithFrame:inView:]
中,单元格会添加NSTextField
来绘制标题。覆盖titleRectForBounds:
并返回NSZeroRect
以删除标题。