Как отобразить вращающийся NSProgressIndicator другим цветом? - PullRequest
21 голосов
/ 19 января 2009

Я использую "Spinner" NSProgressIndicator в моем приложении какао:

spinner image

Я бы хотел отобразить его другим цветом, чтобы он хорошо отображался на темном фоне:

inverted spinner image

Как бы я поступил так? Моим последним средством было бы написать собственный подкласс NSView, который отображает пользовательскую анимацию, но я даже не уверен, с чего начать. Любая помощь приветствуется.

Ответы [ 9 ]

26 голосов
/ 07 апреля 2014

Вот что я сделал:

    #import <QuartzCore/QuartzCore.h>

    ...

    CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"];
    [lighten setDefaults];
    [lighten setValue:@1 forKey:@"inputBrightness"];
    [self.indicator setContentFilters:[NSArray arrayWithObjects:lighten, nil]];
20 голосов
/ 16 февраля 2009

Я фактически реализовал клоны вращающегося NSProgressIndicator, которые могут удовлетворить ваши потребности. Их можно нарисовать в любом размере и в любом цвете. Один из них является подклассом NSView, который можно использовать в OS X 10.4, а другой - подклассом CALayer, который можно использовать в проекте на основе CoreAnimation. Код написан на github (версия на базе NSView и версия CoreAnimation ), и в моем блоге есть запись с несколькими скриншотами

15 голосов
/ 22 января 2009

Не уверен, что это будет работать правильно с NSProgressIndicator, но вы можете попробовать использовать фильтр Core Image, чтобы инвертировать отображение индикатора прогресса. Вы должны сделать слой представления резервным, а затем добавить CIFilter к фильтрам его слоя. Вы можете сделать это все в инспекторе эффектов в Интерфейсном Разработчике, иначе вы можете просто сделать это в коде.

5 голосов
/ 04 сентября 2015

Для более мелкозернистого решения вы можете использовать полиномиальный цветовой подход, используя следующую категорию. Обратите внимание, что для простоты я использую только компонент 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 голосов
/ 27 июня 2014

Хотя я уверен, что код Келана работал некоторое время назад, его сложно обновить. В итоге я выбрал ITProgressIndicator , и потребовалось около 2 минут, чтобы начать работать с Xcode 6 (бета-версия 1) и Yosemite (бета-версия 2).

0 голосов
/ 13 мая 2019

Если вы нацеливаетесь на Мохаве или более позднюю версию, вы можете просто настроить внешний вид прядильщика на темно-синий. Это всегда даст вам белый спиннер, независимо от внешнего вида системы пользователя.

spinner.appearance = NSAppearance(named: .darkAqua)
0 голосов
/ 11 июля 2018

Решение Swift 4

guard let lighten = CIFilter(name: "CIColorControls") else { return }
lighten.setDefaults()
lighten.setValue(1, forKey: "inputBrightness")
contentFilters = [lighten]
0 голосов
/ 14 марта 2018

В Свифт:

override func viewDidLoad() {
    super.viewDidLoad()
    let brightness = CIFilter(name: "CIColorControls")!
    brightness.setDefaults()
    brightness.setValue(1, forKey: "inputBrightness")
    self.spinner.contentFilters = [brightness]
}
0 голосов
/ 19 января 2009

Я видел некоторые сторонние среды управления в стиле HUD, которые включают NSProgressIndicator в стиле бара, но, к сожалению, я не помню, чтобы когда-либо видел счетчик. Если вы не можете найти способ заставить его делать то, что вы хотите, эта страница может сгенерировать анимированный GIF, который может быть полезен для создания вашего собственного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...