【问题标题】:Force NSStatusItem to Redraw强制 NSStatusItem 重绘
【发布时间】: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/…
  • 见needsDisplay。
  • @Willeke 设置需要显示状态项的按钮已修复!把它作为一个答案,我会接受它。

标签: cocoa nsstatusitem nsstatusbar


【解决方案1】:

Willeke 在 cmets 中提供的解决方案是使用 needsDisplay 属性。工作函数为:

-(void)buttonPressed {
    [[[statusItem button] image] setTemplate: false];
    [[statusItem button] setNeedsDisplay: true];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2013-01-08
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-02-11
    相关资源
    最近更新 更多