是啥导致白色边框应用于系统菜单中显示的 NSProgressIndicator?

Posted

技术标签:

【中文标题】是啥导致白色边框应用于系统菜单中显示的 NSProgressIndicator?【英文标题】:What causes a white border to be applied to an NSProgressIndicator displayed in the system menu?是什么导致白色边框应用于系统菜单中显示的 NSProgressIndicator? 【发布时间】:2010-04-26 16:07:26 【问题描述】:

当我创建一个 NSProgressIndicator 和 use NSStatusItem's -setView: method 以在我执行操作时将其显示在菜单栏区域时会发生这种情况:

Example of messed up NSProgressIndicator http://cl.ly/l9R/content

是什么原因导致显示此边框,如何删除它?预期的结果是控件是透明的。

这是我正在使用的代码:

NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] init];

[progressIndicator setBezeled: NO];
[progressIndicator setStyle: NSProgressIndicatorSpinningStyle];
[progressIndicator setControlSize: NSSmallControlSize];
[progressIndicator sizeToFit];
[progressIndicator startAnimation: self];
[statusItem setView: progressIndicator]; // statusItem is an NSStatusItem instance
...
[statusItem setView: nil];
[progressIndicator stopAnimation: self];
[progressIndicator release];

【问题讨论】:

【参考方案1】:

不要缩放NSProgressIndicator,尽管它也是NSView。创建一个调整大小的新视图,在该视图中定位状态指示器,并将封闭视图传递给-[NSStatusItem setView:]。这是我的实现。

NSStatusItem+AnimatedProgressIndicator.m

- (void) startAnimation 

    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];

    [self setView:progressIndicatorHolder];

    [progressIndicator center];

    [progressIndicator setNextResponder:progressIndicatorHolder];
    [progressIndicatorHolder setNextResponder:self];



- (void) stopAnimation 

    [self setView:nil];



- (void) mouseDown:(NSEvent *) theEvent 

    [self popUpStatusItemMenu:[self menu]];



- (void) rightMouseUp:(NSEvent *) theEvent 
- (void) mouseUp:(NSEvent *) theEvent 
…

我添加了一个自定义方法-[NSView center],它执行以下操作:

@implementation NSView (Centering)

- (void) center 

    if (![self superview]) return;

    [self setFrame:NSMakeRect(

        0.5 * ([self superview].frame.size.width - self.frame.size.width),
        0.5 * ([self superview].frame.size.height - self.frame.size.height), 

        self.frame.size.width, 
        self.frame.size.height

    )];



@end

【讨论】:

这绝对有效!唯一的问题是,现在除了显示它并离开它之外,当我执行任何操作时它都不会显示——我正在执行一个 NSTask ,同时显示指示器;有什么想法吗? 重新设置标题会有所帮助。这确实是一个杂乱无章的事情,而轻松地做到这一点的正确方法可能是在自定义视图中处理所有内容,而不是同时依赖自定义视图和 Cocoa 的默认内容。【参考方案2】:

我已经看到您解决了我将留下的问题,这是您实施的替代方案。您可以使用ProgressHud。

【讨论】:

以上是关于是啥导致白色边框应用于系统菜单中显示的 NSProgressIndicator?的主要内容,如果未能解决你的问题,请参考以下文章

Javafx menuitem 白色边框

在别人word中复制的东西粘贴到自己word文档中时在非白色底色的情况下显示为白色,请问如何解决?

海信电视基于linux的智能电视的系统详情是啥?我想知道海信智能电视的linux系统版本?

Android webview周围有白色边框,我该如何摆脱它?

如何更改 MenuStrip 的外观 [重复]

win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法