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

标签 objective-c cocoa calayer appkit nscontrol

上下文:

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 中一次通过细胞。

但是,如果我在 -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/

相关文章:

objective-c - AVAudioUnit(渲染)回调

objective-c - 在 Objective-c 中使用 Static

objective-c - 我如何获得 cocoa 中给定字体系列支持的字体

objective-c - Obj-C/Cocoa 接线接口(interface)对象

swift - 如何在 Swift 中删除 UIButton 的 CALayer 底部边框?

objective-c - 如何子类化 CALayer 以返回预先设置样式的图层?

ios - 在显示附加到 inputAccessoryView 的 UIMenuController 中隐藏 'select' 、 'selectAll' 、 'paste' ?

iphone - 在cocos2D游戏环境下应用Zoom Effect?

Cocoa:使用绑定(bind)来获取实体 key

iphone - 动画 CALayer 的蒙版大小变化