HTML Diff
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) -&gt; UIColor)<p>UITraitCollection содержит в себе основные параметры относящиеся к экрану -- вертикальный или горизонтальный режим, Dark или Light режим, контрастность и т.п. Нас прежде всего интересует userInterfaceStyle которое говорит о текущем режиме.</p>
77 init(dynamicProvider: @escaping (UITraitCollection) -&gt; UIColor)<p>UITraitCollection содержит в себе основные параметры относящиеся к экрану -- вертикальный или горизонтальный режим, Dark или Light режим, контрастность и т.п. Нас прежде всего интересует userInterfaceStyle которое говорит о текущем режиме.</p>
78 <p>Пример:</p>
78 <p>Пример:</p>
79 let color = UIColor { traitCollection -&gt; UIColor in switch traitCollection.userInterfaceStyle { case .light, .unspecified: return .white case .dark: return .black } }<h2>Какие еще есть возможности для создания цвета</h2>
79 let color = UIColor { traitCollection -&gt; 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