Подтвердить что ты не робот

Как отобразить вращающийся NSProgressIndicator в другом цвете?

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

spinner image

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

inverted spinner image

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

4b9b3361

Ответ 1

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

Ответ 2

Это то, что я сделал:

    #import <QuartzCore/QuartzCore.h>

    ...

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

В Свифте:

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

Ответ 8

Swift 4 Solution

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

Ответ 9

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

spinner.appearance = NSAppearance(named: .darkAqua)