使用图像和突出显示自定义NSButtonCell

mss*_*mss 6 macos cocoa

我想为我的应用程序创建一个自定义开关,我在其中为可能的状态(开,关,mousedown)提供三个图像.整个外观都包含在图像中,所以我不希望Cocoa在mousedown期间自己突出显示(变暗)按钮.

目前,我已经创建了一个NSButtonCell子类,将NSButtonTypeMomentaryChange的斜角按钮拖到我的视图中,并将按钮单元类类型自定义设置为我的子类.子类只是实现awakeFromNib来尝试设置一些所需的行为:

- (void)awakeFromNib
{
    [self setShowsStateBy:NSContentsCellMask];
    [self setHighlightsBy:NSContentsCellMask];
}
Run Code Online (Sandbox Code Playgroud)

我认为(根据文档)将禁用按钮的mousedown - 变暗.它不是.

这就是我的立场,现在我有两个问题:

  • 如何设置ButtonCell类只是在mousedown上显示我准备好的图片而不是在按钮周围变暗/绘制边框?
  • 实现交换机其他行为的最干净/最恰当的方法是什么,即根据先前的状态显示关闭/打开位置,并能够将其状态正确地传达给其他对象?

小智 6

将按钮的类型设置为开/关.对其单元格进行子类化.写这两种方法:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    if ([self state])
    {
        [onStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    }
    else
    {
        [offStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    }
} 
- (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    if (flag){
        [downStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

    }
}
Run Code Online (Sandbox Code Playgroud)