Оформление стилевых таблиц NSS - lanit-tercom-school/grouplock GitHub Wiki
Организуем оформление приложений с помощью стилевых таблиц, схожих с CSS. (Перевод официальной документации NUI)
Стиль задаётся CSS-like синтаксисом с поддержкой переменных:
@primaryFontName: HelveticaNeue;
@secondaryFontName: HelveticaNeue-Light;
@primaryFontColor: #333333;
@primaryBackgroundColor: #E6E6E6;
Button {
background-color: @primaryBackgroundColor;
border-color: #A2A2A2;
border-width: @primaryBorderWidth;
font-color: @primaryFontColor;
font-color-highlighted: #999999;
font-name: @primaryFontName;
font-size: 18;
corner-radius: 7;
}
NavigationBar {
background-tint-color: @primaryBackgroundColor;
font-name: @secondaryFontName;
font-size: 20;
font-color: @primaryFontColor;
text-shadow-color: #666666;
text-shadow-offset: 1,1;
}
- Использование
- Стилевые классы
- Типы значений
- Лицензия
Для использования API необходимо подключить модуль NUI:
import NUI
NSS-файл должен находиться в папке проекта. Чтобы применить стили, нужно в методе application(_:didFinishLaunchingWithOptions:)
класса AppDelegate
прописать:
NUISettings.initWithStylesheet("<stylesheet>")
где вместо <stylesheet>
использовать имя NSS-файла без расширения.
В очень редких случаях NUI может не отрендерить некоторые компоненты UIKit. В этом случае можно ему помочь, прописав в методе viewDidLoad()
класса соответствующего ViewController'а:
NUIRenderer.renderButton(myButton)
Например, в этом случае к кнопке применяется стиль Button
, но можно использовать и собственные стили:
NUIRenderer.renderButton(myButton, withClass: "LargeButton")
В NSS-файле прописаны инструкции применения стилей. К примеру, инструкция Button { font-name: Helvetica; }
меняет шрифт всех кнопок.
- Стилевые переменные объявляются сверху
- К элементу могут быть применены несколько стилевых классов; разрешено наследование
К элементам интерфейса можно применять кастомные классы (например, LargeButton
) и осуществлять наследование от одного или множества классов с помощью конструкции Button:LargeButton
. Чтобы к какому-то конкретному элементу не применялись никакие стили, нужно задать его класс как none
. Кастомный класс элемента можно устанавливать как в Interface Builder, так и в коде.
Для этого нужно задать runtime attribute для элемента (Identity Inspector → User Defined Runtime Attributes, нажать +
). Устанавливаем Key Path как nuiClass
, Type как String
, и Value как LargeButton
(или Button:MyButton
, если хотим наследование)
Необходимо импортировать модуль NUI:
import NUI
Потом изменить свойство nuiClass
для элемента:
myButton.nuiClass = "LargeButton"
Стилевой класс может наследоваться от любого числа других стилевых классов. Если вы хотите группировать стили, установите nuiClass
, например, так: "MyStyleGroup1:MyStyleGroup2:MyButton"
.
Если вы не хотите, чтобы к каким-то видам (views) были применены стили (к примеру, это элементы из сторонних библиотек, у которых есть свой собственный стиль), можно указать это в NSS:
Button {
exclude-views: UIAlertButton;
exclude-subviews: UITableViewCell,TDBadgedCell,UITextField;
}
-
exclude-views
предотвратит применение стиляButton
к определённым видам -
exclude-subviews
предотвратит применение стиляButton
ко всем подвидам указанных классов.
Если нужно целиком исключить определённые классы, можно сделать это с помощью NUISettings.setGlobalExclusions(_:)
в application(_:didFinishLaunchingWithOptions:)
:
NUISettings.setGlobalExclusions(["ABMemberCell", "ABMultiCell"])
Переменные и стилевые классы можно определять для отдельных типов устройств и ориентаций экрана с помощью @media:
@media (device:ipad) {
/* стили и переменные для iPad */
}
@media (device:iphone) {
/* стили и переменные для iPhone */
}
@media (orientation:landscape) {
/* стили и переменные для ландшафтной ориентации */
}
@media (orientation:portrait) {
/* стили и переменные для портретной ориентации */
}
@media (orientation:portrait) and (device:ipad) {
/* стили и переменные для портретной ориентации для iPad */
}
Оформление приложения можно менять прямо во время его выполнения в симуляторе. Для этого перед инициализацией NUISettings
в AppDelegate
следует добавить следующее:
if let projectDirectory = NSProcessInfo().environment["PROJECT_DIR"] {
print("\(projectDirectory)")
NUISettings.setAutoUpdatePath("\(projectDirectory)/GroupLock/UI.nss")
}
Однако это не будет работать, пока мы не зададим специальную переменную. Для этого нужно открыть настройки схемы:
Зададим Build на вкладке Arguments новую environment variable с именем PROJECT_DIR
и значением $PROJECT_DIR
:
Теперь, если изменить и сохранить NSS-файл, изменения мгновенно вступят в силу*.
*На самом деле реалтайм-редактирование почему-то работает только в том View Controller, который установлен как Initial. Следует иметь это в виду.
Далее перечислены все доступные стилевые классы, соответствующие им классы компонентов интерфейса, а также поддерживаемые свойства. Типы значений (Color, Gradient) описаны ниже.
Важно: список атрибутов для проекта GroupLock может (и, вероятно, будет) меняться, то есть добавятся новые свойства, а названия старых могут измениться в целях соотвествия наименованиям API Apple. Те свойства, которые изменены, отсутствуют или имеют иное название в официальной спецификации NUI, выделены полужирным.
UIBarButtonItem
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- background-color-highlighted (Color)
- background-image (Image)
- background-image-insets (Box)
- background-tint-color (Color)
- border-color (Color)
- border-width (Number)
- corner-radius (Number)
- font-color (Color)
- font-name (FontName)
- font-size (Number)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
UIBarButtonItem back button, inherits from BarButton
- background-color (Color)
- background-image (Image)
- background-image-insets (Box)
- background-tint-color (Color)
- border-color (Color)
- border-width (Number)
- corner-radius (Number)
- font-color (Color)
- font-name (FontName)
- font-size (Number)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
UIButton
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- background-color-disabled (Color)
- background-color-highlighted (Color)
- background-color-selected (Color)
- background-color-selected-highlighted (Color)
- background-image (Image)
- background-image-insets (Box)
- background-image-disabled (Image)
- background-image-disabled-insets (Box)
- background-image-highlighted (Image)
- background-image-highlighted-insets (Box)
- background-image-selected (Image)
- background-image-selected-insets (Box)
- background-image-selected-disabled (Image)
- background-image-selected-disabled-insets (Box)
- background-image-selected-highlighted (Image)
- background-image-selected-highlighted-insets (Box)
- border-color (Color)
- border-width (Number)
- content-insets (Box)
- corner-radius (Number)
- font-color (Color)
- font-color-disabled (Color)
- font-color-highlighted (Color)
- font-color-selected (Color)
- font-color-selected-disabled (Color)
- font-color-selected-highlighted (Color)
- font-name (FontName)
- font-size (Number)
- height (Number)
- image (Image)
- image-insets (Box)
- image-disabled (Image)
- image-disabled-insets (Box)
- image-highlighted (Image)
- image-highlighted-insets (Box)
- image-selected (Image)
- image-selected-insets (Box)
- image-selected-disabled (Image)
- image-selected-disabled-insets (Box)
- image-selected-highlighted (Image)
- image-selected-highlighted-insets (Box)
- padding (Box)
- shadow-color (Color)
- shadow-offset (Offset)
- shadow-opacity (Number)
- shadow-radius (Number)
- text-align (TextAlign)
- text-alpha (Number)
- text-auto-fit (Boolean)
- text-shadow-color (Color)
- text-shadow-color-disabled (Color)
- text-shadow-color-highlighted (Color)
- text-shadow-color-selected (Color)
- text-shadow-color-selected-disabled (Color)
- text-shadow-color-selected-highlighted (Color)
- text-shadow-offset (Offset)
- text-transform (TextTransform)
- tint-color (Color)
- title-insets (Box)
- width (Number)
UIControl
- background-color (Color)
- background-image (Image)
- border-color (Color)
- border-width (Number)
- corner-radius (Number)
- shadow-color (Color)
- shadow-offset (Offset)
- shadow-opacity (Number)
- shadow-radius (Number)
UILabel
- background-color (Color)
- border-color (Color)
- border-width (Number)
- corner-radius (Number)
- font-color (Color)
- font-color-highlighted (Color)
- font-name (FontName)
- font-size (Number)
- height (Number)
- shadow-color (Color)
- shadow-offset (Offset)
- shadow-opacity (Number)
- shadow-radius (Number)
- text-align (TextAlign)
- text-alpha (Number)
- text-auto-fit (Boolean)
- text-line-clamp (Integer)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
- text-transform (TextTransform)
- width (Number)
UINavigationBar
- bar-tint-color (Color)
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- background-image (Image)
- background-image-insets (Box)
- background-tint-color (Color)
- font-color (Color)
- font-name (FontName)
- font-size (Number)
- shadow-image (Image)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
- title-vertical-offset (Number)
UIPageControl
- color (Color)
pageIndicatorTintColor
- current-color (Color)
currentPageIndicatorTintColor
UIProgressView
- progress-image (Image)
- progress-tint-color (Color)
- track-image (Image)
- track-tint-color (Color)
- width (Number)
UISearchBar
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- background-image (Image)
- background-tint-color (Color)
- scope-background-color (Color)
- scope-background-image (Image)
UISearchBar button, inherits from BarButton
See Button
UISearchBar scope bar, inherits from SegmentedControl
See SegmentedControl
UISegmentedControl
- background-color (Color)
- background-color-selected (Color)
- background-image (Image)
- background-image-insets (Box)
- background-image-selected (Image)
- background-image-selected-insets (Box)
- background-tint-color (Color)
- border-color (Color)
- border-width (Number)
- corner-radius (Number)
- divider-color (Color)
- divider-image (Image)
- font-color (Color)
- font-color-selected (Color)
- font-name (FontName)
- font-size (Number)
- text-shadow-color (Color)
- text-shadow-color-selected (Color)
- text-shadow-offset (Offset)
- text-shadow-offset-selected (Offset)
UISlider
- minimum-track-tint-color (Color)
- maximum-track-tint-color (Color)
- minimum-value-image (Image)
- maximum-value-image (Image)
- thumb-image (Image)
- thumb-tint-color (Color)
UISwitch
- background-color (Color)
- off-image (Image)
- off-image-insets (Box)
- on-image (Image)
- on-image-insets (Box)
- on-tint-color (Color)
- thumb-tint-color (Color)
- tint-color (Color)
UITabBar
- bar-tint-color (Color)
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- background-image (Image)
- background-image-insets (Box)
- background-tint-color (Color)
- selected-image (Image)
- selected-image-tint-color (Color)
UITabBarItem
- background-image-selected (Image)
- background-image-selected-insets (Box)
- finished-image (Image)
- finished-image-selected (Image)
- font-color (Color)
- font-color-selected (Color)
- font-name (FontName)
- font-size (Number)
- text-offset (Offset)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
UITableView
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- row-height (Number)
- separator-color (Color)
- separator-style (SeparatorStyle)
UITableViewCell
- tint-color (Color)
- background-color (Color)
- background-color-top/background-color-bottom (Gradient)
- background-color-selected (Color)
- background-color-top-selected/background-color-bottom-selected (Gradient)
- font-color (Color)
- font-color-highlighted (Color)
- font-name (FontName)
- font-size (Number)
- text-align (TextAlign)
- text-alpha (Number)
- text-auto-fit (Boolean)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
The content view of a UITableViewCell
- all attributes supported by UIView
The detail label of a UITableViewCell
- font-color (Color)
- font-color-highlighted (Color)
- font-name (FontName)
- font-size (Number)
- text-align (TextAlign)
- text-alpha (Number)
- text-auto-fit (Boolean)
- text-shadow-color (Color)
- text-shadow-offset (Offset)
UIToolbar
- background-color (Color)
- background-image-top (Image)
- background-image-bottom (Image)
- background-image-top-landscape (Image)
- background-image-bottom-landscape (Image)
- background-tint-color (Color)
- shadow-image (Image)
- shadow-image-top (Image)
- shadow-image-bottom (Image)
UITextField
- background-color (Color)
- background-image (Image)
- background-image-insets (Box)
- border-color (Color)
- border-style (BorderStyle)
- border-width (Number)
- corner-radius (Number)
- font-color (Color)
- font-name (FontName)
- font-size (Number)
- height (Number)
- padding (Box)
- shadow-color (Color)
- shadow-offset (Offset)
- shadow-opacity (Number)
- shadow-radius (Number)
- tint-color (Color)
- vertical-align (VerticalAlign)
- width (Number)
- keyboard-appearance (KeyboardAppearance)
UITextView
- font-color (Color)
- font-name (FontName)
- font-size (Number)
- padding (Box)
- keyboard-appearance (KeyboardAppearance)
- all other attributes supported by UIView
UIView
- background-color (Color)
- background-image (Image)
- border-color (Color)
- border-width (Number)
- corner-radius (Number)
- height (Number)
- shadow-color (Color)
- shadow-offset (Offset)
- shadow-opacity (Number)
- shadow-radius (Number)
- width (Number)
UIWindow
- background-color (Color)
-
Boolean - логический тип (
true
илиfalse
) -
BorderStyle - стиль границы UITextBorderStyle. Принимает значения
none
,line
,bezel
иrounded
. -
Box - последовательность из четырёх целых чисел, обозначающих толщины границ прямоугольников. Аналог свойств CSS
padding
иmargin
(верхнее, правое, нижнее, левое). Пример:15
(прямоугольник с толщиной каждого края в 15px),10 15
(прямоугольник с толщиной верхнего и нижнего краёв 10px и толщиной правого и левого краёв 15px) -
Color - цвет в шестнадцатеричной форме (
#FF0000
или#FF0000FF
с альфа-каналом); либо RGB, RGBA, HSL или HSLA (rgb(255,0,0)
илиhsla(0.5, 0, 1.0, 0.5)
); либо название цвета, для которого у UIColor есть одноимённый метод (red
,yellow
,clear
). -
FontName - название шрифта. Список доступных на iOS шрифтов можно увидеть здесь. Также может принимать следующие значения:
system
boldSystem
italicSystem
blackSystem
heavySystem
lightSystem
mediumSystem
semiboldSystem
thinSystem
ultraLightSystem
-
Gradient - два цвета, образующие вертикальный градиент.
background-color-top
иbackground-color-bottom
должны быть определены в отдельных свойствах. - Image - имя файла изображения.
-
Number - любое число (
-1
,4.5
) -
Offset - два числа, представляющие горизонтальное и вертикальное смещение (
-1,1
) -
SeparatorStyle - стиль разделителя UITableViewSeparatorStyle. Принимает значения
none
,single-line
иsingle-line-etched
. -
TextAlign - выравнивание текста (
left
,right
,center
) -
TextTransform - регистр текста (
uppercase
,lowercase
,capitalize
,none
) -
VerticalAlign - вертикальное выравнивание (
top
,center
,bottom
,fill
) -
KeyboardAppearance - стиль клавиатуры (
default
,dark
,light
,alert
)
NUI распространяется под лицензией MIT.