如何以不同的颜色显示旋转的NSProgressIndicator?

时间:2009-01-19 03:25:32

标签: cocoa

我在我的可可应用程序中使用了“spinner”NSProgressIndicator:

spinner image

我想用不同的颜色显示它,以便在黑暗的背景下显示出来:

inverted spinner image

我该怎么做呢?我的最后一招是编写我自己的自定义NSView子类来渲染自定义动画,但我甚至不确定从哪方面开始。任何帮助表示赞赏。

9 个答案:

答案 0 :(得分:26)

这就是我所做的:

    #import <QuartzCore/QuartzCore.h>

    ...

    CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"];
    [lighten setDefaults];
    [lighten setValue:@1 forKey:@"inputBrightness"];
    [self.indicator setContentFilters:[NSArray arrayWithObjects:lighten, nil]];

答案 1 :(得分:20)

我实际上已经实现了可能适合您需求的旋转NSProgressIndicator克隆。它们可以以任何尺寸和任何颜色绘制。一个是NSView的子类,可以在OS X 10.4上使用,另一个是CALayer的子类,可以在基于CoreAnimation的项目中使用。代码在github上(NSView-based版本和CoreAnimation-based版本),我的博客上有post with some screenshots

答案 2 :(得分:15)

不确定这是否适用于NSProgressIndicator,但您可以尝试使用Core Image过滤器来反转进度指示器视图的显示。您必须支持视图层,然后向其图层的过滤器添加CIFilter。您可以在Interface Builder中的效果检查器中完成所有操作,否则您也可以在代码中执行此操作。

答案 3 :(得分:5)

虽然我确定Kelan的代码工作不久前,但很难更新。我最终选择了ITProgressIndicator,使用Xcode 6(Beta 1)和Yosemite(Beta 2)花了大约2分钟。

答案 4 :(得分:5)

对于更精细的解决方案,您可以使用以下类别的多项式颜色方法。请注意,为简单起见,我只使用向量的x分量。有关更准确的颜色匹配,请参阅参考:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIColorMatrix

@import QuartzCore;
#import <Cocoa/Cocoa.h>

@interface NSProgressIndicator (Colors)

- (void)setCustomColor:(NSColor *)aColor;

@end

@implementation NSProgressIndicator (Colors)

- (void)setCustomColor:(NSColor *)aColor {
    CIFilter *colorPoly = [CIFilter filterWithName:@"CIColorPolynomial"];
    [colorPoly setDefaults];

    CIVector *redVector = [CIVector vectorWithX:aColor.redComponent Y:0 Z:0 W:0];
    CIVector *greenVector = [CIVector vectorWithX:aColor.greenComponent Y:0 Z:0 W:0];
    CIVector *blueVector = [CIVector vectorWithX:aColor.blueComponent Y:0 Z:0 W:0];
    [colorPoly setValue:redVector forKey:@"inputRedCoefficients"];
    [colorPoly setValue:greenVector forKey:@"inputGreenCoefficients"];
    [colorPoly setValue:blueVector forKey:@"inputBlueCoefficients"];
    [self setContentFilters:[NSArray arrayWithObjects:colorPoly, nil]];
}

@end

答案 5 :(得分:0)

我见过一些第三方HUD风格的控制框架,其中包括条形NSProgressIndicator,但不幸的是我不记得曾经看过旋转器。如果你找不到办法让它做你想做的事,this page可以生成一个动画gif,可能有助于你自己制作。

答案 6 :(得分:0)

在斯威夫特:

override func viewDidLoad() {
    super.viewDidLoad()
    let brightness = CIFilter(name: "CIColorControls")!
    brightness.setDefaults()
    brightness.setValue(1, forKey: "inputBrightness")
    self.spinner.contentFilters = [brightness]
}

答案 7 :(得分:0)

Swift 4解决方案

guard let lighten = CIFilter(name: "CIColorControls") else { return }
lighten.setDefaults()
lighten.setValue(1, forKey: "inputBrightness")
contentFilters = [lighten]

答案 8 :(得分:0)

如果您要定位Mojave或更高版本,则只需将微调框的外观设置为深绿色。无论用户的系统外观如何,这都将始终为您提供白色的微调器。

spinner.appearance = NSAppearance(named: .darkAqua)