内容:

苹果已经在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/

10-10 20:36