我在我的可可应用程序中使用了“spinner”NSProgressIndicator:
我想用不同的颜色显示它,以便在黑暗的背景下显示出来:
我该怎么做呢?我的最后一招是编写我自己的自定义NSView子类来渲染自定义动画,但我甚至不确定从哪方面开始。任何帮助表示赞赏。
答案 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)