【发布时间】:2020-08-20 06:23:34
【问题描述】:
我创建了一个NSStatusItem 并添加了一张图片。添加图像后,更改image.template 属性不会立即对图标产生影响。只有单击状态项后,图像才会成为模板。有没有办法强制系统重绘状态项/栏?
我整理了一个简单的例子,按下“测试”按钮将图像更改为模板,但是直到选择状态图标后更改才生效。
-(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];
}
【问题讨论】:
-
不能在添加图片之前设置
image.template吗?请发布您的代码。 -
大多数控件假定图像是不可变的。如果您改变图像,请尝试再次设置
image属性,或循环它(将其设置为nil,然后再次设置图像)以说服视图重绘。 -
@Willeke 它是第 3 方 API 的一部分,所以可以在添加图像之前设置它,但 API 必须允许它在之后发生。代码被埋在这里,但我们很快就会用一个可重现的例子来修改原来的例子。 github.com/AdoptOpenJDK/openjdk-jdk11u/compare/…
-
@Willeke 设置需要显示状态项的按钮已修复!把它作为一个答案,我会接受它。
标签: cocoa nsstatusitem nsstatusbar