在 NSStatusItem 中使用 NSProgressIndicator

Posted

技术标签:

【中文标题】在 NSStatusItem 中使用 NSProgressIndicator【英文标题】:Using an NSProgressIndicator in an NSStatusItem 【发布时间】:2012-09-22 10:56:35 【问题描述】:

我正在使用此代码(受此处其他问题的启发):

- (void)showProgressIndicator 

    if (statusItem) 

        NSLog(@"wassup");
        NSView *progressIndicatorHolder = [[NSView alloc] init];
        NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] init];
        [progressIndicator setBezeled: NO];
        [progressIndicator setStyle: NSProgressIndicatorSpinningStyle];
        [progressIndicator setControlSize: NSSmallControlSize];
        [progressIndicator sizeToFit];
        [progressIndicator setUsesThreadedAnimation:YES];
        [progressIndicatorHolder addSubview:progressIndicator];
        [progressIndicator startAnimation:self];
        [statusItem setView:progressIndicatorHolder];
        [progressIndicator setNextResponder:progressIndicatorHolder];
        [progressIndicatorHolder setNextResponder:statusItem];
    

不幸的是,一旦此代码运行,状态项(最初显示图像)就会消失...为什么我的代码不起作用?

【问题讨论】:

(1) 您使用的是 ARC,对吗? (2) 视图progressIndicatorHolder 的大小是多少?如果您明确设置progressIndicatorHolderframe,这有帮助吗? (1) 是 (2) 我没有指定尺寸,但显然它的宽度是 0。现在要尝试几件事... 所以我明确设置了progressIndicatorHolderframe,它工作正常,但由于某种原因进度指示器没有居中(它太低)。我将如何离开这里?像这样显式分配frame 可以吗? 您可能需要manually center。作为替代方案,如果您想做更复杂的布局,您可以将自定义视图放在一个 nib 中,并在您为 NSStatusItem 创建视图时按需加载它。 好的,谢谢艾伦!如果您想让您的 cmets 成为答案,我会选择它作为最佳答案,因为它解决了我的问题。 【参考方案1】:

您可能需要在progressIndicatorHolder 上显式设置frame,然后在其父视图中居中progressIndicator,例如:

CGRect holderRect = progressIndicatorHolder.bounds;
CGRect indicatorRect = progressIndicatorHolder.frame;
indicatorRect.origin.x = (holderRect.size.width - indicatorRect.size.width)/2.0f;
indicatorRect.origin.y = (holderRect.size.height - indicatorRect.size.height)/2.0f;
progressIndicator.frame = indicatorRect;

作为替代方案,如果您发现想要进行更复杂的布局,您可以从 nib 加载 NSStatusItem 的视图。

【讨论】:

【参考方案2】:

以下代码对我有用。

progressIndicator = [[NSProgressIndicator alloc] init];

[progressIndicator setBezeled: YES];
[progressIndicator setStyle: NSProgressIndicatorSpinningStyle];
[progressIndicator setControlSize: NSSmallControlSize];
[progressIndicator sizeToFit];
[progressIndicator setUsesThreadedAnimation:YES];

oldView = [statusItem view];
[statusItem setView:progressIndicator];

[progressIndicator sizeToFit];
[statusItem setView:progressIndicator];
[progressIndicator startAnimation:self];

请注意 progressIndicatorHolder 没有在任何地方设置。

【讨论】:

以上是关于在 NSStatusItem 中使用 NSProgressIndicator的主要内容,如果未能解决你的问题,请参考以下文章

检查 NSStatusItem 当前是不是显示在 OS X NSStatusBar 主菜单栏中

在 Java 中创建一个 NSStatusItem/Menubar 应用程序

Swift:10.10 中的 NSStatusItem 菜单行为(例如,仅在鼠标右键单击时显示)

如何使用 NSStatusItem 作为拖动目的地?

从 Swift 中的 NSStatusItem(菜单栏)应用程序访问菜单

更新 NSStatusItem 的图像