0

语境:

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 中,一次在 Cell 中。

-drawRect:但是,如果我在而不是 中执行与上述完全相同的工作-updateLayer,则单元格不会进行任何绘图(因为我没有使用 调用它[self.cell drawInteriorWithFrame:ControlView:]

在我的一生中,我无法弄清楚当关联的 controlView(我的按钮子类)选择加入-updateLayer而不是-drawRect:.

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

-updateLayer有人可以告诉我如何在其关联的 controlView 使用而不是NSCell 时阻止其绘制-drawRect:吗?

4

1 回答 1

2

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

于 2018-06-16T13:46:56.087 回答