上下文:
苹果在macOS上有“软-反对”的macOS。我试图在我的自定义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中做的工作与上面完全相同,那么单元格就不会执行任何绘图(因为我没有用[self.cell drawInteriorWithFrame:ControlView:]调用它)
对于我的生活来说,当关联的controlView (我的按钮子类)选择-updateLayer而不是-drawRect:时,我无法弄清楚是什么触发了单元格绘图。
我看过关于NSControl.h和NSView.h的所有方法。我已经重写了所有的-updateCell和相关方法。这些都不是罪魁祸首。我不能简单地设置self.cell=nil,因为NSControl仍然依赖于NSCell来处理事件,等等。
当NSCell的相关controlView使用-updateLayer而不是-drawRect:时,有人能告诉我如何阻止它绘图吗?
发布于 2018-06-16 13:46:56
在-[NSButtonCell layoutLayerWithFrame:inView:]中,单元格添加一个NSTextField来绘制标题。重写titleRectForBounds:并返回NSZeroRect以删除标题。
https://stackoverflow.com/questions/50803492
复制相似问题