Як я можу програмно отримати синій колір iOS 7 за замовчуванням?


223

Я створюю власні елементи у своєму додатку і хочу відповідати зовнішньому вигляду нового iOS. iOS 7 представив нам дуже поширений світлий синій колір, колір або відтінок за замовчуванням для декількох елементів, включаючи системну кнопку, сегментоване управління тощо. Вони спростили вибір кольору за допомогою IB, як видно тут:

введіть тут опис зображення

Однак я не знайшов, як легко отримати доступ до кольорів програмно. Я перевірив документацію UIColor , і, здається, немає жодного аксесуара для синього системного кольору у самому класі.

Ось моє запитання: чи існує простий аксесуар для цього кольору? [UIColor ?]чи щось подібне? Якщо ні, чи знає хтось точні значення RGB для цього кольору?

Відповіді:


252

Використовувати self.view.tintColorз контролера перегляду або self.tintColorз UIViewпідкласу.


6
Я збирався сказати, що ви можете просто використовувати UIView().tintColor, але насправді ви не можете. Не впевнений, в який момент UIView отримує набір кольорів відтінку ...
Dan Rosenstark

1
@DanRosenstark Я думаю, що UIWindowабо, можливо, його кореневий вигляд має оригінальну версію. Перегляди успадковують свій відтінок від більш високих поглядів у ланцюжку відповідей, але у вашому прикладі новий погляд не має суперпрогляду.
Аарон Брагер

2
self.view.tintColorзсередини UIViewController.viewDidLoad()дає право синій.
Ніколас Міарі

234

Здається, є [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

скріншот, що показує вікно Кольори


2
Цікаво, що синій колір за замовчуванням у моїй системі виглядає як 0: 128: 255 (за допомогою того ж інструменту). Цікаво, чи Apple змінила це нещодавно?
Джоель Х.

@JoelH. Перевірте кольоровий простір, який ви зараз використовуєте.
Річард Дж. Росс III

19
Будьте уважні, як ви користуєтесь цим, оскільки це може змінитися в наступних випусках iOS.
Зев Айзенберг

7
Так, безумовно, не дуже гарна ідея жорсткого кодування будь-якого значення, яке може потенційно змінитись. Особливо, коли є API для запиту фактичного значення.
Nicolas Miari

1
Швидка версіяUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos

90

Синій колір iOS 7 є за замовчуванням R:0.0 G:122.0 B:255.0

UIColor *ios7BlueColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];

51
А якщо ви віддаєте перевагу шестигранному:0x007aff
Джейсон Мур

4
Це не дуже майбутнє доказ - якщо Apple змінить колір відтінку за замовчуванням або дозволить користувачам встановити колір відтінку за замовчуванням, ваша програма не отримає правильний колір.
prewett

4
та в іншій системі: # 007AFF
daleijn

3
У Swift: нехай defaultTintColor = UIColor (червоний: 0,0, зелений: 122/255, синій: 1,0, альфа: 1)
Джервісбай

49

Відповідно до документації для UIButton:

В iOS v7.0 всі підкласи UIView виводять свою поведінку для tintColor з базового класу. Докладнішу інформацію див. У дискусії про tintColor на рівні UIView.

Якщо припустити, що ви не змінюєте tintColor перед тим, як захопити значення за замовчуванням, ви можете використовувати:

self.view.tintColor

Схоже, найбезпечніший спосіб захопити колір.
Кліфф Гельсель

Це працює для мене. У мене sharedApplication()немає keyWindowсtintColor
SimplGy

26

Ось простий спосіб отримати кольоровий колір відтінку за замовчуванням:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}

вам не потрібно один раз відправляти основні теми. Простий, якщо нуль буде достатньо.
мальхал

6
Чому припускають, що метод буде викликаний лише з основної нитки? Накладні витрати до dispatch_onceдосить низькі і є одиничними, якщо перевірити в загальній справі.
Рік

@Rick Оскільки API UIKit не є безпечним для фонових потоків, тому виклик його за межі основного потоку заборонено.
Андрій Таранцов

@AndreyTarantsov це правда, але це є безпечним для використання UIColorна декількох потоків. Обгортання його dispatch_onceдозволяє безпечно отримувати цей колір на будь-якій нитці. І знову накладні витрати дуже низькі.
Рік

3
@AndreyTarantsov з швидкого тесту, здається, працює добре. З документації UIVIew : "Маніпуляції з користувальницьким інтерфейсом вашої програми повинні відбуватися в основному потоці. Таким чином, ви завжди повинні викликати методи класу UIView з коду, що працює в основному потоці вашої програми. Єдиний раз це може бути не строго Це необхідно при створенні самого об'єкта перегляду, але всі інші маніпуляції повинні відбуватися в основному потоці ".
Рік


16

стрімкий 4 шлях:

extension UIColor {
  static let system = UIView().tintColor!
}

Настійно не рекомендую використовувати вимушене розгортання, оскільки це може спричинити збій програми, якщо поведінка UIKit Framework за замовчуванням буде змінена в будь-якій наступній версії. Також отримання кольору відтінку від екземпляра UIView не може гарантувати, що цей колір є системним кольором відтінку.
Станіслав Баранускі

@StanislauBaranouski Чому вони повинні змінити це? Поясніть, будь ласка, свою думку
Дмитро Козлов

тут не потрібно ніяких пояснень, це лише погана практика використовувати примусове розкручування, особливо якщо ви можете цього уникнути.
Станіслав Баранускі

15

Це розширення надає рідній системі синій колір.

extension UIColor {

    static var systemBlue: UIColor {
        return UIButton(type: .system).tintColor
    }

}

ОНОВЛЕННЯ

Будь ласка, забудьте те, що я написав вище, тільки що з’ясував - є нативне розширення із заздалегідь заданими кольорами системи, які ми шукали, включаючи системний синій :

// System colors

extension UIColor {


    /* Some colors that are used by system elements and applications.
     * These return named colors whose values may vary between different contexts and releases.
     * Do not make assumptions about the color spaces or actual colors used.
     */

    ... 

    @available(iOS 7.0, *)
    open class var systemBlue: UIColor { get }
    ... 
}

Ви можете використовувати його безпосередньо:

myView.tintColor = .systemBlue

1
Цей буде створювати UIButton щоразу, коли ви запитаєте systemBlue краще, щоб ввести цей колір один раз. Використання внутрішнього слова у внутрішньому розширенні не є зручним для користувачів. Те саме для використання класу замість статичного. І називати його "Блакитним" неправильно, тому що цей колір можна буде змінити пізніше, як у macOS Mojave. Так що static let system = UIView().tintColor!все-таки набагато краще, ніж ваш варіант.
Дмитро Козлов

@DmitryKozlov ви праві, краще використовувати статичну належну пам'ять. Дякуємо, що вказали на це. Але називати його "синім" все ще працює до iOS 12, і це зовсім не пов'язано з macOS. Для macOS вам доведеться мати справу з типом NSColor.
Станіслав Баранускі

14

Отримати колір автоматично, використовуючи цей код:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!

10

UIWindow.tintColorМетод не працює для мене в iOS8 (він був ще чорний), так що я повинен був зробити це:

let b = UIButton.buttonWithType(UIButtonType.System) as UIButton
var color = b.titleColorForState(.Normal)

Це надавало належного синього відтінку, поміченого в UIBarButtonItem


Відчувається трохи брудною, але це краще, ніж жорстке кодування кольору посилань, який може змінитися з часом.
timgcarlson

7

З iOS 7 є API, і ви можете отримати (і встановити) колір відтінку за допомогою:

self.view.tintColor

Або якщо вам потрібен CGColor:

self.view.tintColor.CGColor

6

У багатьох випадках те, що вам потрібно, просто

[self tintColor] 
// or if in a ViewController
[self.view tintColor]

або для швидкого

self.tintColor
// or if in a ViewController
self.view.tintColor

1
self.view.tintColor вірогідніший
злочин

3

під час встановлення кольору ви можете встановити такий колір

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]

Чому потрібно писати /255.0з кожним rgbзначенням?
Аділ Малик

7
Оскільки кольори на маках - це поплавк між 0,0 та 1,0.
мальхал

2

Додавши категорію до UIColor наступним чином, ви зробите її доступною вам у будь-який час, коли вам це потрібно, або навіть змініть її визначення у коді:

@interface UIColor (iOS7Colors)

+ (instancetype)iOS7blueColor;

@end

@implementation UIColor (SpecialColors)

+ (instancetype)iOS7blueColor;
{
    return [UIColor colorWithRed:0.0f green:0.22f blue:122.0/255.0 alpha:1.0f];
}

Після імпорту Категорії у свій код ви можете зателефонувати за кольором, скориставшись:

UIColor *myBlueColor = [UIColor iOSblueColor];

Спробуйте прочитати цей stackoverflow.com/help/deleted-answers , щоб отримати більше розуміння того, як не відповісти. А саме: "Відповіді, які принципово не відповідають на питання": ледве більше, ніж посилання на зовнішній сайт
Radim Köhler

Мм Звідки ми отримуємо від blueдо redв+ (instancetype)iOS7redColor;
ta.speot.is
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.