强制 NSStatusItem 重绘
Force NSStatusItem to Redraw
我创建了一个 NSStatusItem
并添加了一张图片。添加图像后,更改 image.template
属性 不会立即对图标产生影响。只有单击状态项后,图像才会成为模板。有没有办法强制系统重绘状态item/bar?
我整理了一个简单的例子,按下'test'按钮将图像更改为模板,但只有选择状态图标后更改才会生效。
-(void)awakeFromNib{
// Setup status item
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
statusMenu = [[NSMenu alloc] initWithTitle:@""];
menuItem = [[NSMenuItem alloc] initWithTitle:@"test"
action:nil
keyEquivalent:@""];
NSImage* img = [NSImage imageNamed:@"aubergine.png"];
img.template = true;
img.size = NSMakeSize(18.0, 18.0);
statusItem.button.image = img;
[statusItem setMenu:statusMenu];
[statusMenu addItem:menuItem];
// Add button to window
NSButton* button = [[NSButton alloc] initWithFrame:NSMakeRect(10, 10, 50, 20)];
[[window contentView] addSubview: button];
[button setTitle: @"Test"];
[button setTarget:self];
[button setAction:@selector(buttonPressed)];
}
-(void)buttonPressed {
[[[statusItem button] image] setTemplate: false];
}
正如 Willeke 在评论中提供的那样,解决方案是使用 needsDisplay
属性。工作函数为:
-(void)buttonPressed {
[[[statusItem button] image] setTemplate: false];
[[statusItem button] setNeedsDisplay: true];
}
我创建了一个 NSStatusItem
并添加了一张图片。添加图像后,更改 image.template
属性 不会立即对图标产生影响。只有单击状态项后,图像才会成为模板。有没有办法强制系统重绘状态item/bar?
我整理了一个简单的例子,按下'test'按钮将图像更改为模板,但只有选择状态图标后更改才会生效。
-(void)awakeFromNib{
// Setup status item
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
statusMenu = [[NSMenu alloc] initWithTitle:@""];
menuItem = [[NSMenuItem alloc] initWithTitle:@"test"
action:nil
keyEquivalent:@""];
NSImage* img = [NSImage imageNamed:@"aubergine.png"];
img.template = true;
img.size = NSMakeSize(18.0, 18.0);
statusItem.button.image = img;
[statusItem setMenu:statusMenu];
[statusMenu addItem:menuItem];
// Add button to window
NSButton* button = [[NSButton alloc] initWithFrame:NSMakeRect(10, 10, 50, 20)];
[[window contentView] addSubview: button];
[button setTitle: @"Test"];
[button setTarget:self];
[button setAction:@selector(buttonPressed)];
}
-(void)buttonPressed {
[[[statusItem button] image] setTemplate: false];
}
正如 Willeke 在评论中提供的那样,解决方案是使用 needsDisplay
属性。工作函数为:
-(void)buttonPressed {
[[[statusItem button] image] setTemplate: false];
[[statusItem button] setNeedsDisplay: true];
}