0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>UIColor дает возможность настроить цвет для Dark Mode, дает семантический набор цветов "от Apple", а также дает возможность задать не только цвет, но и паттерн заполнения пространства, что как бы кричит нам, что UIColor -- это вовсе не цвет. Давайте слегка заглянем в эти чертоги UIColor.</p>
1
<p>UIColor дает возможность настроить цвет для Dark Mode, дает семантический набор цветов "от Apple", а также дает возможность задать не только цвет, но и паттерн заполнения пространства, что как бы кричит нам, что UIColor -- это вовсе не цвет. Давайте слегка заглянем в эти чертоги UIColor.</p>
2
<p>UIColor -- это класс, который хранит данные о цвете и прозрачности. Цвет в iOS может быть представлен в разных цветовых пространствах, самое известное из которых RGB. На самом деле, сам цвет хранится в свойстве cgColor класса CGColor. В iOS существуют несколько сущностей, которые могут хранить информацию о цвете -- каждый для своего фреймворка:</p>
2
<p>UIColor -- это класс, который хранит данные о цвете и прозрачности. Цвет в iOS может быть представлен в разных цветовых пространствах, самое известное из которых RGB. На самом деле, сам цвет хранится в свойстве cgColor класса CGColor. В iOS существуют несколько сущностей, которые могут хранить информацию о цвете -- каждый для своего фреймворка:</p>
3
<ul><li>для UIKit это класс UIColor,</li>
3
<ul><li>для UIKit это класс UIColor,</li>
4
<li>для SwiftUI это структура Color,</li>
4
<li>для SwiftUI это структура Color,</li>
5
<li>для Core Graphics это класс CGColor,</li>
5
<li>для Core Graphics это класс CGColor,</li>
6
<li>для Core Image это класс CIColor.</li>
6
<li>для Core Image это класс CIColor.</li>
7
</ul><p>В данной статье я постараюсь рассказать о классе UIColor, который является частью фреймворка UIKit.</p>
7
</ul><p>В данной статье я постараюсь рассказать о классе UIColor, который является частью фреймворка UIKit.</p>
8
<h2>Системные цвета</h2>
8
<h2>Системные цвета</h2>
9
<p>В UIKit есть некоторые предопределенные цвета, которые вы можете использовать в своем проекте. Например, зелёный UIColor.green или часто достаточно написать просто .green. Написав так, будет использован конкретный цвет со значениями RGB 0.0, 1.0, 0.0 и уровнем прозрачности 1.0. Но в UIColor, определен также цвет UIColor.systemGreen. Чем он отличается от обычного UIColor.green?</p>
9
<p>В UIKit есть некоторые предопределенные цвета, которые вы можете использовать в своем проекте. Например, зелёный UIColor.green или часто достаточно написать просто .green. Написав так, будет использован конкретный цвет со значениями RGB 0.0, 1.0, 0.0 и уровнем прозрачности 1.0. Но в UIColor, определен также цвет UIColor.systemGreen. Чем он отличается от обычного UIColor.green?</p>
10
<p>Начиная с iOS 13.0, появился Dark Mode. Пользователь может выбрать в настройках системы в каком цветовом теме ему комфортнее работать -- в светлой теме или в тёмной. И зеленый цвет для этих режимов будет немного отличаться. Более того, пользователь для комфортного восприятия может выбрать высококонтрастный режим, повышающий контрастность между элементами интерфейса и фона. И зеленый цвет для этого режима тоже будет другим.</p>
10
<p>Начиная с iOS 13.0, появился Dark Mode. Пользователь может выбрать в настройках системы в каком цветовом теме ему комфортнее работать -- в светлой теме или в тёмной. И зеленый цвет для этих режимов будет немного отличаться. Более того, пользователь для комфортного восприятия может выбрать высококонтрастный режим, повышающий контрастность между элементами интерфейса и фона. И зеленый цвет для этого режима тоже будет другим.</p>
11
<p>Нам, разработчикам, зачастую без разницы какой оттенок одного цвета используется, но специалисты Apple, глубоко проработали этот вопрос с учетом сочетаемости цветов в разных режимах и состояний экрана, и с точки зрения восприятия цветов для людей с проблемами по зрению. Недооценивать возможность использовать системные цвета не стоит - и при отсутствии дизайнеров в проекте, которые способны подобрать цвета для проекта, при прочих равных лучше выбирать цвета начинающиеся на "system...":</p>
11
<p>Нам, разработчикам, зачастую без разницы какой оттенок одного цвета используется, но специалисты Apple, глубоко проработали этот вопрос с учетом сочетаемости цветов в разных режимах и состояний экрана, и с точки зрения восприятия цветов для людей с проблемами по зрению. Недооценивать возможность использовать системные цвета не стоит - и при отсутствии дизайнеров в проекте, которые способны подобрать цвета для проекта, при прочих равных лучше выбирать цвета начинающиеся на "system...":</p>
12
<ul><li>systemBlue</li>
12
<ul><li>systemBlue</li>
13
<li>systemIndigo</li>
13
<li>systemIndigo</li>
14
<li>systemOrange</li>
14
<li>systemOrange</li>
15
<li>systemPink</li>
15
<li>systemPink</li>
16
<li>systemPurple</li>
16
<li>systemPurple</li>
17
<li>systemRed</li>
17
<li>systemRed</li>
18
<li>systemTeal</li>
18
<li>systemTeal</li>
19
<li>systemYellow</li>
19
<li>systemYellow</li>
20
</ul><p>Замечу -- эти системные цвета меняют только оттенок основного цвета -- зеленый цвет не сможет стать синим, он будет либо чуть светлым зеленым, либо чуть темным зеленым.</p>
20
</ul><p>Замечу -- эти системные цвета меняют только оттенок основного цвета -- зеленый цвет не сможет стать синим, он будет либо чуть светлым зеленым, либо чуть темным зеленым.</p>
21
<p>Кроме того, есть несколько системных оттенков серых цветов, которые вы можете использовать для второстепенных элементов интерфейса -- разделители, тени, границы и т.п.</p>
21
<p>Кроме того, есть несколько системных оттенков серых цветов, которые вы можете использовать для второстепенных элементов интерфейса -- разделители, тени, границы и т.п.</p>
22
<ul><li>systemGray</li>
22
<ul><li>systemGray</li>
23
<li>systemGray2</li>
23
<li>systemGray2</li>
24
<li>systemGray3</li>
24
<li>systemGray3</li>
25
<li>systemGray4</li>
25
<li>systemGray4</li>
26
<li>systemGray5</li>
26
<li>systemGray5</li>
27
<li>systemGray6</li>
27
<li>systemGray6</li>
28
</ul><p>Еще раз, повторю, все эти системные цвета способны адаптировать под различные настройки или состояния интерфейса. Как подобные цвета создавать самому мы посмотрим далее.</p>
28
</ul><p>Еще раз, повторю, все эти системные цвета способны адаптировать под различные настройки или состояния интерфейса. Как подобные цвета создавать самому мы посмотрим далее.</p>
29
<p>Как вы могли заметить, среди этих цветов нет цветов Black или White, которые в основном как раз используются для текста или фона. Тут как раз приходят на помощь семантические цвета.</p>
29
<p>Как вы могли заметить, среди этих цветов нет цветов Black или White, которые в основном как раз используются для текста или фона. Тут как раз приходят на помощь семантические цвета.</p>
30
<h2>Семантические цвета</h2>
30
<h2>Семантические цвета</h2>
31
<p>Концепция семантических цветов позволяет абстрагироваться от конкретных цветов, сделав акцент на предназначении цвета. В UIKit нам знаком такой цвет как tintColor, который обозначает цвет, который призывает пользователя к действию -- например, это может быть цвет системных кнопок, ссылок, вкладок в UISegmentControl и т.п. В вашем приложении может быть определен брендированный цвет -- например, мы можем назвать его как brandColor или primaryBrandColor/secondaryBrandColor. Или это может быть свой уникальный цвет всех текстовых элементов.</p>
31
<p>Концепция семантических цветов позволяет абстрагироваться от конкретных цветов, сделав акцент на предназначении цвета. В UIKit нам знаком такой цвет как tintColor, который обозначает цвет, который призывает пользователя к действию -- например, это может быть цвет системных кнопок, ссылок, вкладок в UISegmentControl и т.п. В вашем приложении может быть определен брендированный цвет -- например, мы можем назвать его как brandColor или primaryBrandColor/secondaryBrandColor. Или это может быть свой уникальный цвет всех текстовых элементов.</p>
32
<p>Смысл использования семантических цветов в том, чтобы определить их в одном месте и дальше ссылаться из всех частей приложения только на одно место -- место, где вы определили семантические цвета. К примеру, вы хотите использовать красный цвет для всех UILabel в вашем приложении. Вместо того, чтобы в каждом UILabel задать тексту цвет .red, гораздо удобнее определить свой семантический цвет:</p>
32
<p>Смысл использования семантических цветов в том, чтобы определить их в одном месте и дальше ссылаться из всех частей приложения только на одно место -- место, где вы определили семантические цвета. К примеру, вы хотите использовать красный цвет для всех UILabel в вашем приложении. Вместо того, чтобы в каждом UILabel задать тексту цвет .red, гораздо удобнее определить свой семантический цвет:</p>
33
let primaryTextColor = UIColor.red<p>и во всех UILabel его использовать:</p>
33
let primaryTextColor = UIColor.red<p>и во всех UILabel его использовать:</p>
34
label.textColor = primaryTextColor<p>Конечно, красный цвет -- сомнительная история для использования как цвет текста, поэтому к вам обязательно придет дизайнер или заказчик и попросит поменять цвет на другой. В таком случае вы это сможете сделать не более чем за минуту, просто переопределив свой primaryTextColor.</p>
34
label.textColor = primaryTextColor<p>Конечно, красный цвет -- сомнительная история для использования как цвет текста, поэтому к вам обязательно придет дизайнер или заказчик и попросит поменять цвет на другой. В таком случае вы это сможете сделать не более чем за минуту, просто переопределив свой primaryTextColor.</p>
35
<p>В общем случае крайне рекомендуется использовать семантические цвета даже на небольших проектах. Но сперва по этому поводу вам нужно будет договорится со своим дизайнером, который при передаче макетов разработчику будут закладывать в используемых цветах элементов интерфейса именно семантические наименования.</p>
35
<p>В общем случае крайне рекомендуется использовать семантические цвета даже на небольших проектах. Но сперва по этому поводу вам нужно будет договорится со своим дизайнером, который при передаче макетов разработчику будут закладывать в используемых цветах элементов интерфейса именно семантические наименования.</p>
36
<h2>Семантические цвета в UIKit</h2>
36
<h2>Семантические цвета в UIKit</h2>
37
<p>Apple предлагает свою систему семантических цветов, которую вы можете использовать в приложении. Более того, цвета из этой системы вы будете неосознанно использовать если не будете менять цвета стандартных контролов. В UIKit предлагаются следующие цвета.</p>
37
<p>Apple предлагает свою систему семантических цветов, которую вы можете использовать в приложении. Более того, цвета из этой системы вы будете неосознанно использовать если не будете менять цвета стандартных контролов. В UIKit предлагаются следующие цвета.</p>
38
<p>Цвета текста:</p>
38
<p>Цвета текста:</p>
39
<ul><li>label -- для обозначения основного текста</li>
39
<ul><li>label -- для обозначения основного текста</li>
40
<li>secondaryLabel -- вторичный текст</li>
40
<li>secondaryLabel -- вторичный текст</li>
41
<li>tertiaryLabel -- текст третьей значимости</li>
41
<li>tertiaryLabel -- текст третьей значимости</li>
42
<li>quaternaryLabel -- текст четвертой значимости</li>
42
<li>quaternaryLabel -- текст четвертой значимости</li>
43
</ul><p>Вы, к примеру, цвет secondaryLabel можете использовать для подзаголовков, а tertiaryLabel для сносок или примечаний в тексте.</p>
43
</ul><p>Вы, к примеру, цвет secondaryLabel можете использовать для подзаголовков, а tertiaryLabel для сносок или примечаний в тексте.</p>
44
<p>Цвета для заполнения:</p>
44
<p>Цвета для заполнения:</p>
45
<ul><li>systemFill</li>
45
<ul><li>systemFill</li>
46
<li>secondarySystemFill</li>
46
<li>secondarySystemFill</li>
47
<li>tertiarySystemFill</li>
47
<li>tertiarySystemFill</li>
48
<li>quaternarySystemFill</li>
48
<li>quaternarySystemFill</li>
49
</ul><p>Apple предлагает использовать эти цвета для наполнения разных фигур/контролов типа слайдеров, полей поиска, кнопок и т.п.</p>
49
</ul><p>Apple предлагает использовать эти цвета для наполнения разных фигур/контролов типа слайдеров, полей поиска, кнопок и т.п.</p>
50
<p>Цвет для плейсхолдера:</p>
50
<p>Цвет для плейсхолдера:</p>
51
<ul><li>placeholderText</li>
51
<ul><li>placeholderText</li>
52
</ul><p>Цвета для фона:</p>
52
</ul><p>Цвета для фона:</p>
53
<ul><li>systemBackground</li>
53
<ul><li>systemBackground</li>
54
<li>secondarySystemBackground</li>
54
<li>secondarySystemBackground</li>
55
<li>tertiarySystemBackground</li>
55
<li>tertiarySystemBackground</li>
56
</ul><p>Можно использовать для разного вида фонов.</p>
56
</ul><p>Можно использовать для разного вида фонов.</p>
57
<p>Цвета для фонов сгруппированных элементов:</p>
57
<p>Цвета для фонов сгруппированных элементов:</p>
58
<ul><li>systemGroupedBackground</li>
58
<ul><li>systemGroupedBackground</li>
59
<li>secondarySystemGroupedBackground</li>
59
<li>secondarySystemGroupedBackground</li>
60
<li>tertiarySystemGroupedBackground</li>
60
<li>tertiarySystemGroupedBackground</li>
61
</ul><p>Используются для таблиц со стилем .grouped для фона сгруппированных элементов.</p>
61
</ul><p>Используются для таблиц со стилем .grouped для фона сгруппированных элементов.</p>
62
<p>Цвета для разделителей:</p>
62
<p>Цвета для разделителей:</p>
63
<ul><li>separator</li>
63
<ul><li>separator</li>
64
<li>opaqueSeparator</li>
64
<li>opaqueSeparator</li>
65
</ul><p>Цвет для ссылок:</p>
65
</ul><p>Цвет для ссылок:</p>
66
<ul><li>link</li>
66
<ul><li>link</li>
67
</ul><p>Отдельно цвета для текста, которые не адаптируются под темную или светлую тему:</p>
67
</ul><p>Отдельно цвета для текста, которые не адаптируются под темную или светлую тему:</p>
68
<ul><li>darkText</li>
68
<ul><li>darkText</li>
69
<li>lightText</li>
69
<li>lightText</li>
70
</ul><p>Используя эти семантические цвета UIKit для целей, которые обозначены в их описании, будет обеспечиваться их сочетаемость нативным образом.</p>
70
</ul><p>Используя эти семантические цвета UIKit для целей, которые обозначены в их описании, будет обеспечиваться их сочетаемость нативным образом.</p>
71
<h2>Как создать цвет, который будет адаптироваться под Dark или Light-режимы</h2>
71
<h2>Как создать цвет, который будет адаптироваться под Dark или Light-режимы</h2>
72
<p>Первый вариант -- в XCode в Assets проекта добавить для каждого цвета Color Set, в котором можно отдельно задать цвета для Dark и Light Mode в настройке Appearances. Там же можно задать, что вы хотите для данного цвета задать параметры для высококонтрастного режима.</p>
72
<p>Первый вариант -- в XCode в Assets проекта добавить для каждого цвета Color Set, в котором можно отдельно задать цвета для Dark и Light Mode в настройке Appearances. Там же можно задать, что вы хотите для данного цвета задать параметры для высококонтрастного режима.</p>
73
<p>В дальнейшем к этому цвету можно обращаться так:</p>
73
<p>В дальнейшем к этому цвету можно обращаться так:</p>
74
let color = UIColor(named: "ColorName")<p>этот цвет автоматически будет меняться "на лету" при изменении режима настройки в iOS.</p>
74
let color = UIColor(named: "ColorName")<p>этот цвет автоматически будет меняться "на лету" при изменении режима настройки в iOS.</p>
75
<p>Второй вариант -- задать условия и значения цвета в коде, в зависимости от текущих параметров системы.</p>
75
<p>Второй вариант -- задать условия и значения цвета в коде, в зависимости от текущих параметров системы.</p>
76
<p>Делается это в конструкторе UIColor:</p>
76
<p>Делается это в конструкторе UIColor:</p>
77
init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)<p>UITraitCollection содержит в себе основные параметры относящиеся к экрану -- вертикальный или горизонтальный режим, Dark или Light режим, контрастность и т.п. Нас прежде всего интересует userInterfaceStyle которое говорит о текущем режиме.</p>
77
init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)<p>UITraitCollection содержит в себе основные параметры относящиеся к экрану -- вертикальный или горизонтальный режим, Dark или Light режим, контрастность и т.п. Нас прежде всего интересует userInterfaceStyle которое говорит о текущем режиме.</p>
78
<p>Пример:</p>
78
<p>Пример:</p>
79
let color = UIColor { traitCollection -> UIColor in switch traitCollection.userInterfaceStyle { case .light, .unspecified: return .white case .dark: return .black } }<h2>Какие еще есть возможности для создания цвета</h2>
79
let color = UIColor { traitCollection -> UIColor in switch traitCollection.userInterfaceStyle { case .light, .unspecified: return .white case .dark: return .black } }<h2>Какие еще есть возможности для создания цвета</h2>
80
<p>Конструкторы для создания UIColor можно разделить на три типа:</p>
80
<p>Конструкторы для создания UIColor можно разделить на три типа:</p>
81
<ul><li>для создания в разных пространствах цветов HSB, RGB</li>
81
<ul><li>для создания в разных пространствах цветов HSB, RGB</li>
82
<li>для создания UIColor на основе цветов из других нативных фреймворков</li>
82
<li>для создания UIColor на основе цветов из других нативных фреймворков</li>
83
<li>для создания на основе паттерна картинки</li>
83
<li>для создания на основе паттерна картинки</li>
84
</ul><p>Интересный вариант -- создать UIColor на основе картинки...</p>
84
</ul><p>Интересный вариант -- создать UIColor на основе картинки...</p>
85
init(patternImage image: UIImage)<p>Данный конструктор создает UIColor, при этом мы не задаем цвет, а передаем в качестве основы картинку. В итоге назначив этот цвет, например, тексту UILabel, вы получите интересный эффект -- текст будет отображен при помощи паттерна картинки.</p>
85
init(patternImage image: UIImage)<p>Данный конструктор создает UIColor, при этом мы не задаем цвет, а передаем в качестве основы картинку. В итоге назначив этот цвет, например, тексту UILabel, вы получите интересный эффект -- текст будет отображен при помощи паттерна картинки.</p>
86
<h2>Вывод</h2>
86
<h2>Вывод</h2>
87
<p>Несмотря на то, что UIColor достаточно простой класс, он предоставляет возможности управления цветом в зависимости от текущих параметров. Кроме того, как мы увидели, он может задавать не только цвет, но и в целом метод заполнения пространства. В помощь разработчикам Apple дает набор семантических цветов, упрощающих разработку, и позволяющих немного абстрагировать цвет элементов интерфейса.</p>
87
<p>Несмотря на то, что UIColor достаточно простой класс, он предоставляет возможности управления цветом в зависимости от текущих параметров. Кроме того, как мы увидели, он может задавать не только цвет, но и в целом метод заполнения пространства. В помощь разработчикам Apple дает набор семантических цветов, упрощающих разработку, и позволяющих немного абстрагировать цвет элементов интерфейса.</p>
88
88