Как программно получить синий цвет по умолчанию для iOS 7?

223

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

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

Тем не менее, я не нашел, как легко получить доступ к цвету программно. Я проверил документацию по UIColor , и в самом классе, похоже, нет никакого средства доступа к синему системному цвету.

Вот мой вопрос: существует ли простой аксессуар для этого цвета? [UIColor ?]или как то так? Если нет, знает ли кто-нибудь точные значения RGB для этого цвета?

Джоэл Х.
источник

Ответы:

252

Используйте self.view.tintColorиз контроллера представления или self.tintColorиз UIViewподкласса.

Аарон Брагер
источник
6
Я собирался сказать, что вы можете просто использовать UIView().tintColor, но на самом деле вы не можете. Не уверен, в какой момент UIView получит цветовой оттенок ...
Дэн Розенстарк
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].

снимок экрана с окном Цвета

Greg
источник
2
Интересно, что по умолчанию синий цвет в моей системе составляет 0: 128: 255 (с использованием того же инструмента). Интересно, Apple недавно изменила это?
Джоэл Х.
@JoelH. Проверьте цветовое пространство, которое вы используете в данный момент.
Ричард Дж. Росс III
19
Будьте осторожны в том, как вы используете это, так как оно может измениться в последующих выпусках iOS.
Зев Айзенберг,
7
Да, определенно не очень хорошая идея жестко кодировать любое значение, которое потенциально может измениться. Особенно, когда есть API для запроса фактического значения.
Николас Миари
1
Свифт версияUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Даг Амос
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];
Tarum
источник
51
И если вы предпочитаете гекс:0x007aff
Джейсон Мур
4
Это не очень надежно в будущем - если Apple изменит цвет оттенка по умолчанию или позволит пользователям установить цвет оттенка по умолчанию, ваше приложение не получит правильный цвет.
prewett
4
и в другой системе: # 007AFF
daleijn
3
В Swift: пусть defaultTintColor = UIColor (красный: 0,0, зеленый: 122/255, синий: 1,0, альфа: 1)
Jervisbay
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

cscott530
источник
Кажется немного грязным, но это лучше, чем жесткое программирование цвета ссылки, которая может со временем меняться.
Тимгкарлсон
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.tintЦвет более вероятен
малхал
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 , чтобы лучше понять, как не отвечать. А именно: «Ответы, которые не дают принципиального ответа на вопрос»: чуть больше, чем ссылка на внешний сайт
Радим Келер,
Э-э, как мы добрались blueдо redв+ (instancetype)iOS7redColor;
ta.speot.is