cocoa - usar - ¿Cómo puedo mostrar el NSProgressIndicator giratorio en un color diferente?
como usar la cocoa (8)
Estoy usando un NSProgressIndicator "spinner" en mi aplicación Cocoa:
imagen spinner http://img88.imageshack.us/img88/118/picture12cn4.png
Me gustaría mostrarlo en un color diferente para que se muestre bien en un fondo oscuro:
imagen invertida de spinner http://img398.imageshack.us/img398/1769/invertedspinnerck3.png
¿Cómo voy a hacer esto? Mi último recurso sería escribir mi propia subclase NSView personalizada que rinde una animación personalizada, pero ni siquiera estoy seguro de por dónde empezar en ese frente. Cualquier ayuda es apreciada.
Aunque estoy seguro de que el código de Kelan funcionó hace un tiempo, es difícil actualizarlo. Terminé yendo con ITProgressIndicator , y me llevó aproximadamente 2 minutos trabajar con Xcode 6 (Beta 1) y Yosemite (Beta 2).
De hecho, he implementado clones del NSProgressIndicator giratorio que podría satisfacer sus necesidades. Se pueden dibujar en cualquier tamaño y en cualquier color. Una es una subclase de NSView, que se puede usar en OS X 10.4, y la otra es una subclase de CALayer, que se puede usar en un proyecto basado en CoreAnimation. El código está en github (tanto la versión NSView-based en NSView como la NSView-based CoreAnimation-based ), y hay una publicación con algunas capturas de pantalla en mi blog.
En Swift:
override func viewDidLoad() {
super.viewDidLoad()
let brightness = CIFilter(name: "CIColorControls")!
brightness.setDefaults()
brightness.setValue(1, forKey: "inputBrightness")
self.spinner.contentFilters = [brightness]
}
Esto es lo que hice:
#import <QuartzCore/QuartzCore.h>
...
CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"];
[lighten setDefaults];
[lighten setValue:@1 forKey:@"inputBrightness"];
[self.indicator setContentFilters:[NSArray arrayWithObjects:lighten, nil]];
He visto algunos marcos de control de estilo HUD de terceros que incluyen el NSProgressIndicator de estilo de barra, pero desafortunadamente no recuerdo haber visto nunca el spinner. Si no puede encontrar la forma de hacer que haga lo que desea, esta página puede generar un gif animado que podría ser útil para hacer el suyo propio.
No estoy seguro de si esto funcionaría correctamente con NSProgressIndicator, pero podría intentar usar un filtro Core Image para invertir la visualización de la vista del indicador de progreso. Tendría que hacer que la capa de vista esté respaldada, y luego agregar un CIFilter
a los filtros de su capa. Puede hacer todo esto en el inspector de efectos en Interface Builder; de lo contrario, también podría hacerlo en código.
Para una solución de grano más fino, puede usar un enfoque de color polinomial usando la siguiente Categoría. Tenga en cuenta que, para simplificar, solo uso el componente x de los vectores. Para una coincidencia de color más precisa, consulte la referencia en: 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
Solución Swift 4
guard let lighten = CIFilter(name: "CIColorControls") else { return }
lighten.setDefaults()
lighten.setValue(1, forKey: "inputBrightness")
contentFilters = [lighten]