强制NSStatusItem重绘

问题描述

我创建一个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];
}

解决方法

如Willeke在评论中提供的那样,解决方案是使用inputView属性。工作功能是:

needsDisplay

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...