层支持的NSControl仍然调用NSCell绘图例程



Context:

苹果在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 仍然接收绘制命令并绘制其标题,从而导致我的控件中出现"模糊"的标题字符串,因为该字符串被绘制了两次 - 一次在我的文本图层中,一次由单元格绘制。

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

我一生都无法弄清楚当关联的 controlView(我的按钮子类(选择加入-updateLayer而不是-drawRect:时触发单元格绘图的原因。

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

有人可以告诉我当NSCell的关联控件视图使用-updateLayer而不是-drawRect:时如何阻止NSCell绘制吗?

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

相关内容

  • 没有找到相关文章

最新更新