Luk*_*uke 12 macos cocoa objective-c nsstatusitem osx-yosemite
从OS X 10.10开始,大部分NSStatusItem都被弃用,而不是该button属性,该属性由NSStatusBarButton组成.它应该像普通按钮一样工作,但遗憾的是NSStatusButton中的cell和setCell方法也已被弃用.由于这个原因,我很难找到一种方法来保持按钮在点击后突出显示(通常按钮在鼠标按下时突出显示,在鼠标向上突出显示.我希望在鼠标按下后保持按钮突出显示).
调用[NSStatusButton setHighlighted:]它的动作不起作用,因为一旦鼠标启动它似乎不会自动亮起.另一方面,使用延迟在下一个循环中调用它,即使[self performSelector: withDelay:]突出显示以相当难看的方式闪烁.它有效,但看起来不太好.
设置按钮类型以NSToggleButton完全删除突出显示,而是突出显示奇怪的模板图像.
这是我能想到的唯一方法.反正有没有覆盖这个NSButtonCell mouseUp行为?
这是另一个选择.不要设置NSStatusItem的action属性.而是添加本地事件监视器:
[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.
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.
我向状态项添加了一个子视图,并在该视图内添加了 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也不再有效
| 归档时间: |
|
| 查看次数: |
2612 次 |
| 最近记录: |