Layer-Backed NSControl 仍然调用 NSCell 绘图例程
Layer-Backed NSControl Still Calls NSCell Drawing Routines
上下文:
Apple 在 macOS 上有“soft-deprecated”NSCell。我试图减少在我的自定义 NSControl 子类中使用它,而是使用 CALayers 来处理我的绘图。为此,我创建了 NSButton 子类 layer-backed:
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
和相关方法。 None 是罪魁祸首。我不能简单地设置 self.cell=nil
因为 NSControl 仍然依赖 NSCell 进行事件处理等
有人能告诉我如何在关联的 controlView 使用 -updateLayer
而不是 -drawRect:
时阻止 NSCell 绘图吗?
在-[NSButtonCell layoutLayerWithFrame:inView:]
中,单元格添加一个NSTextField
来绘制标题。覆盖 titleRectForBounds:
和 return NSZeroRect
以删除标题。
上下文:
Apple 在 macOS 上有“soft-deprecated”NSCell。我试图减少在我的自定义 NSControl 子类中使用它,而是使用 CALayers 来处理我的绘图。为此,我创建了 NSButton 子类 layer-backed:
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
和相关方法。 None 是罪魁祸首。我不能简单地设置 self.cell=nil
因为 NSControl 仍然依赖 NSCell 进行事件处理等
有人能告诉我如何在关联的 controlView 使用 -updateLayer
而不是 -drawRect:
时阻止 NSCell 绘图吗?
在-[NSButtonCell layoutLayerWithFrame:inView:]
中,单元格添加一个NSTextField
来绘制标题。覆盖 titleRectForBounds:
和 return NSZeroRect
以删除标题。