NSStatusBarButton保持突出显示

Luk*_*uke 12 macos cocoa objective-c nsstatusitem osx-yosemite

从OS X 10.10开始,大部分NSStatusItem都被弃用,而不是该button属性,该属性由NSStatusBarButton组成.它应该像普通按钮一样工作,但遗憾的是NSStatusButton中的cellsetCell方法也已被弃用.由于这个原因,我很难找到一种方法来保持按钮在点击后突出显示(通常按钮在鼠标按下时突出显示,在鼠标向上突出显示.我希望在鼠标按下后保持按钮突出显示).

调用[NSStatusButton setHighlighted:]它的动作不起作用,因为一旦鼠标启动它似乎不会自动亮起.另一方面,使用延迟在下一个循环中调用它,即使[self performSelector: withDelay:]突出显示以相当难看的方式闪烁.它有效,但看起来不太好.

设置按钮类型以NSToggleButton完全删除突出显示,而是突出显示奇怪的模板图像.

这是我能想到的唯一方法.反正有没有覆盖这个NSButtonCell mouseUp行为?

Ant*_*kov 9

这是另一个选择.不要设置NSStatusItemaction属性.而是添加本地事件监视器:

[NSEvent addLocalMonitorForEventsMatchingMask:(NSLeftMouseDown | NSRightMouseDown)
                                      handler:^NSEvent *(NSEvent *event) {
                                          if (event.window == self.statusItem.button.window) {
                                              [self itemClicked];
                                              return nil;
                                          }
                                          return event;
                                      }];
Run Code Online (Sandbox Code Playgroud)

然后-itemClicked使用highlight:方法突出显示按钮:

- (void)itemClicked {
    [self.statusItem.button highlight:YES];
    // Do other stuff 
}
Run Code Online (Sandbox Code Playgroud)

要取消强调只需拨打按钮即可highlight:NO.


eri*_*las 7

Swift 3版Manfred Urban的回答.适用于El Capitan.

extension NSStatusBarButton {

   public override func mouseDown(_ event: NSEvent) {

        if (event.modifierFlags.contains(NSControlKeyMask)) {
            self.rightMouseDown(event)
            return
        }

        self.highlight(true)

        (self.target as? TrivialTargetClass)?.togglePopover()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果合适,请不要忘记再次将按钮highlight属性设置为false.


Luk*_*uke 4

我向状态项添加了一个子视图,并在该视图内添加了 mouseDown 等的事件处理程序,该处理程序称为 [[statusItem 按钮]highlight:true]。事实证明 setHighlighted: 并没有做与 height: 相同的事情。

NSArray *array = [NSArray arrayWithObjects:[statusItem button], [self statusItemView], nil];
[[[statusItem button] superview] setSubviews:array];
//Highlight like so:
[[statusItem button] highlight:true];
Run Code Online (Sandbox Code Playgroud)

编辑:从 El Capitan 开始,这种方法不再有效,而且statusItem.button.highlight = true也不再有效