【问题标题】:Change NSButton's background color on highlight在突出显示时更改 NSButton 的背景颜色
【发布时间】:2018-10-28 16:35:16
【问题描述】:

我有一个 NSButton,我希望它在突出显示时具有与未突出显示时不同的背景颜色(如果不突出显示,则透明,如果这有什么不同的话)。

目前我有如下代码

[view setWantsLayer:YES];

NSButton* button = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[button setBordered:FALSE];
[(NSButtonCell*)[button cell] setHighlightsBy:NSChangeBackgroundCellMask];

[view addSubview:button];

这会将背景更改为单击时的默认窗口背景颜色。如果我删除 NSChangeBackgroundCellMask,背景就会消失。

有没有一种简单的方法可以为背景设置不同的颜色,或者这是否需要我将 NSButton 子类化?

【问题讨论】:

标签: macos cocoa nsbutton


【解决方案1】:

最后,我通过子类化NSButtonCell并覆盖解决了这个问题

- (void) highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView*)controlView

进行我想要的更改(基于flag 更改controlView.layer.backgroundColor)

【讨论】:

【解决方案2】:

您需要继承 NSButton 并覆盖其 mouseDown: 和 mouseUp: 事件,在这些事件中更改 NSButton 的颜色。

【讨论】:

  • 奇怪的是,mouseUp: 没有为我正确调用,所以我最终改为继承 NSButtonCell。
  • 请注意:NSButtonCell的鼠标事件只有在你设置showBorderOnlyWhileMouseInside = YES时才会被调用
  • mouseUp 从来没有叫过我
  • NSButton 在 mouseDown: 上进入它自己的嵌套事件循环。这就是你没有得到 mouseUp: 事件的原因。用于跟踪鼠标的嵌套事件循环将其吞下以知道何时返回主事件循环。
【解决方案3】:

Cobbal 答案的 Swift 版本:

override func highlight(_ flag: Bool, withFrame cellFrame: NSRect, in controlView: NSView) {
        //do nothing, to disable highlight
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2012-06-28
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多