内容:
苹果已经在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中,一次在Cell中)。但是,如果我在
-drawRect:
中而不是在-updateLayer
中执行与上述完全相同的工作,则该单元格不进行任何绘制(因为我不使用[self.cell drawInteriorWithFrame:ControlView:]
对其进行调用)我一生都无法弄清楚当关联的controlView(我的按钮子类)已选择加入
-updateLayer
而不是-drawRect:
时触发单元格绘图的原因。我已经看过NSControl.h和NSView.h上的所有方法。我已经覆盖了所有
-updateCell
和相关方法。这些都不是罪魁祸首。我不能简单地设置self.cell=nil
,因为NSControl仍然依赖NSCell进行事件处理等。有人可以告诉我如何在与其关联的controlView使用
-updateLayer
而不是-drawRect:
时停止绘制NSCell吗? 最佳答案
在-[NSButtonCell layoutLayerWithFrame:inView:]
中,单元格添加NSTextField
来绘制标题。覆盖titleRectForBounds:
并返回NSZeroRect
以删除标题。
关于objective-c - 层支持的NSControl仍调用NSCell绘图例程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50803492/