Набор хелперов и обёрток
В составе три модуля:
- UIViewController
- Identifiable: уникальный идентификатор для view controller
- UIView
- LoadingIndicator: блокирующий user iteraction индикатор загрузки
- XibLoadable: обёртка, загружающая и добавляющая UIView из xib файла
- ReuseIdentifiable: уникальный для класса, переиспользуемый идентификатор
- Int
- Declension: скроление слов, в зависимости от их количества
- String
- Html: хелперы для работы с html строкой
- Marked: "раскрашивание" подстроки
- Currency: форматирование и работа с ценами
- HEXColorable: конвертация строкового представления HEX цвета в UIColor
- RemoveCharacters: обёртка для удаления символов из строки
- iOS 10.0+
- Xcode 10.2+
- Swift 5+
Добавьте следующую строку в ваш Podfile:
pod 'AeroHelpers'
Затем в консоли в папке с вашим проектом выполните команду pod install
.
Незабудьте перед использованием добавить import AeroHelpers
в файле, где вы собираетесь инициализировать использование библиотеку.
В AeroHelpers
включены все модули. Однако, в случае необходимости, можно ставить только отдельные модули, например:
pod 'AeroHelpers/Int'
pod 'AeroHelpers/UIView'
Скачайте архив из ветки master
(стабильная версия) или интересующую вас версию из releases.
Распакуйте и перенесите необхоидимые вам модули из папки AeroHelpers
в свой проект.
Предоставляет уникальный идентификатор для view controller.
Документация
У UIViewController
, соответствующего протоколу Identifiable имеются два свойства:
static var reuseIdentifier: String { get }
var reuseIdentifier: String { get }
Каждое возвращает имя класса-наследника от UIViewController
Примеры и кейсы использования
import AEROHelpers
import UIKit
class DetalisViewController: UIViewController, Identifiable { // Обьявляем что DetalisViewController соответствует протоколу Identifiable
//...
}
...
class SomeViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case DetalisViewController.identifier: // Id перехода на DetalisViewController соответствует классу DetalisViewController
// делаем что необходимо, внедряем в DetalisViewController, etc
default:
break
}
}
}
Индикатор загрузки, появляющийся поверх любой вьюшки.
Документация
У каждой UIView
появляется два метода и свойство:
var isLoadingProgress: Bool
func showLoading(fogging: Bool = true, fogColor: UIColor? = .none, indicatorStyle: UIActivityIndicatorView.Style? = .none, indicatorColor: UIColor? = .none)
func hideLoading()
Первый метод стартует индикатор загрузки, по всему frame
UIView
. Второй метод его убирает.
Свойство isLoadingProgress
возвращает true
, если в настоящий момент индикатор активен.
В случае если не передан fogColor
- цвет затенения будет lightGray
с alpha
0.4.
indicatorStyle
по умолчанию - grey
.
Через Appearance
, являющийся классом LoadingIndicator
можно настроить следующие параметры:
- fogColor - цвет затенения.
- indicatorStyle - тип индикатора загрузки.
- indicatorColor - цвет индикатора загрузки.
Примеры и кейсы использования
import AEROHelpers
import UIKit
class ViewController: UIViewController {
@IBOutlet private var startLoadingButton: UIButton?
@IBAction private func tapStartLoadingButton() {
startLoadingButton?.showLoading()
DispatchQueue.main.asyncAfter(deadline: .now() + 5) { // или, например, запрос к серверу
self.startLoadingButton?.hideLoading()
}
}
}
Пример настройки Appearance
LoadingIndicator.appearance().fogColor = .red
LoadingIndicator.appearance().indicatorStyle = .whiteLarge
LoadingIndicator.appearance().indicatorColor = .blue
Загружает костомные UIView
из xib файла.
Документация
Любая кастомная UIView, которая соответствует протоколу XibLoadable
, уже имеет в своём распоряжении метод loadXib()
.
Этот метод загружает view из соответсвующего имени класса xib файла. Его необходимо вызывать при ините view.
Примеры и кейсы использования
import AEROHelpers
import UIKit
class SomeCustomView: UIView, XibLoadable {
@IBOutlet var label: UILabel?
@IBOutlet var button: UIButton?
override init(frame: CGRect) { // при инициализации в коде
super.init(frame: frame)
loadXib()
}
required init?(coder aDecoder: NSCoder) { // при инициализации из другого xib/storyboard
super.init(coder: aDecoder)
loadXib()
}
override func awakeFromNib() {
super.awakeFromNib()
//настраиваем view...
}
}
В файле SomeCustomView.xib
указываем file owner:
В результате такую view можно использовать и на другом xib/storyboard, так и создавать и добавлять на view программно.
Предоставляет уникальный идектификтор для UIView
Документация
Используется в основном у UITableViewCell и UICollectionViewCell для регистрации ячеек, имеющих вёрстку в xib файле и для получения ячеек по идентификатору в cellForRow
методах UITableView
и UICollectionView
.
У любой UIView
реализующей протокол ReuseIdentifiable
появляется два свойства:
static var reuseIdentifier: String { get }
var reuseIdentifier: String { get }
Возвращающие уникальный идентификтор для каждого класса, совпадающий с именем класса.
Примеры и кейсы использования
//Coming soon...
Скроняет слова в зависимости от кол-ва сущностей.
Документация
Все целые числа типа Int
получили:
- структуру
DeclensionsVariants
, содержашую список вариантов; - свойство
defaultsDeclensions
, содержащую список предустановленныхDeclensionsVariants
- метод
declension
, выполняющий непосредственно склонение
Структура DeclensionsVariants
с 3-мя свойствами:
- oneVariant - должен содержать вариант, подходящий под условие: остаток от деления на 10 == 1 (1 день, 21 день, 1361 день).
- mediumVariant - должен содержать вариант, подходящий под условие: остаток от деления на 10 в промежутке от 2 до 4 включительно (2 дня, 24 дня, 1363 дня).
- othersVariants - должен содержать вариант, подходящий под условие: остаток от деления на 100 в промежутке от 5 до 20 включительно, или остаток от деления на 10 (10 дней, 111 дней, 14 дней)
Cвойство defaultsDeclensions
возвращает структуру с набором имеющихся типов склонений. Это:
- days - дни ("день", "дня", "дней")
- seconds - секунды ("секунду", "секунды", "секунд")
- stones - камни ("камень", "камня", "камней")
- products - изделия ("изделие", "изделия", "изделий")
- productsGoods - товары ("товар", "товара", "товаров")
- items - элементы ("элемент", "элемента", "элементов")
Примеры и кейсы использования
// Предустановленные варианты:
print("Ждём \(23) \(12.defaultsDeclensions.seconds)") // Ждём 23 секунды
print("Доставка через \(86) \(86.defaultsDeclensions.days)") // Доставка через 86 дней
// Кастомные варианты:
let variants = Int.DeclensionsVariants("год", "года", "лет")
print("Ему \(5) \(5.declension(variants))") // Ему 5 лет
print("Где-то \(23) \(23.declension(variants)) назад") // Где-то 23 года назад
print("Спустя \(13) \(10.declension(variants))") // Спустя 13 лет
Преобразует строку с html тегами и html entities в максимально соответствующую ей NSAtributtedString
.
Документация
Расширение структуры String
, включающее в себя следующие методы:
- html - пытается сконвертировать строку, содержащую HTML в соответствующую ей NSAttributedString. В случае неудачи возвращает nil.
- htmlDecoded - пытается убрать или декодировать все HTML сущности, и перевести html-строку в обычную. В случае неудачи возвращает nil.
- nl2br - убирает из строки все
\r
символы и заменяет все\n
символы на тег<br/>
. - br2nl - заменяет в строке все
<br/>
теги на символ\n
.
Примеры и кейсы использования
html
let htmlString = "<font style=\"font-family: Helvetica; font-size: 24pt; \">Start <br>te st<br><br> <b>bold</b> </font>"
print("\(htmlString.html!)")
Результат:
Start
te st
{
NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
NSFont = "<UICTFont: 0x157e01220> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 32.00pt";
NSKern = 0;
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 38/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
NSStrokeWidth = 0;
}bold{
NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
NSFont = "<UICTFont: 0x157e0c870> font-family: \"Helvetica\"; font-weight: bold; font-style: normal; font-size: 32.00pt";
NSKern = 0;
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 38/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
NSStrokeWidth = 0;
} {
NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
NSFont = "<UICTFont: 0x157e01220> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 32.00pt";
NSKern = 0;
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 38/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
NSStrokeWidth = 0;
}
htmlDecoded
let htmlString = "<font style=\"font-family: Helvetica; font-size: 24pt; \">Start <br>te st<br><br> <b>bold</b> </font>"
print("\(htmlString.htmlDecoded!)")
Результат:
Start
te st
bold
br2nl
let htmlString = "<font style=\"font-family: Helvetica; font-size: 24pt; \">Start <br>te st<br><br> <b>bold</b> </font>"
print("\(htmlString.nl2br)")
Результат:
<font style="font-family: Helvetica; font-size: 24pt; ">Start
te st
<b>bold</b> </font>
nl2br
let htmlString = "Start \nte st\n\n <b>bold</b>"
print("\(htmlString.br2nl)")
Результат:
Start <br/>te st<br/><br/> <b>bold</b>
Выделяет часть подстроки, с помощью цвета и шрифта.
Документация
Расширение структуры String
содержит следующий метод markSubstrings
:
func markSubstrings(_ markedSubstrings: [String],
mainFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize),
mainColor: UIColor = .darkText,
markFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize),
markColor: UIColor = .blue,
isOnlyFirst: Bool = false) -> NSAttributedString?
Все параметры, кроме markedSubstrings
опциональны.
Входные параметры:
- markedSubstrings: список подстрок, которые необходимо выделить;
- mainFont: основной шрифт, по умолчанию системный шрифт, системного размера;
- mainColor: цвет основного текста, по умолчанию
darkText
; - markFont: шрифт выделенной подстроки, по умолчанию совпадает с шрифтом основного текста;
- markColor: цвет выделелнной подстроки, по умолчанию - голубой;
- isOnlyFirst: если в значении
true
, то тогда буду выделены все вхождения подстроки, иначе только первое найденное. По-умолчанию -false
.
Через Appearance
класс MarkedSubstrings
можно задать следующие параметры:
- mainFont.
- mainColor.
- markFont.
- markColor.
Примеры и кейсы использования
let testString = "Test with test for test if testing is available."
let markedString = testString.markSubstrings(["test"])
print("\(markedString)")
let testString = "Test with test for test if testing is available."
let font = UIFont(name: "Futura-Bold", size: 24)
let markedString = testString.markSubstrings(["test"], markFont: font!, markColor: .red, isOnlyFirst: true)
print("\(markedString)")
Пример настройки Appearance
:
MarkedSubstrings.appearance().mainFont = .systemFont(ofSize: 20)
MarkedSubstrings.appearance().mainColor = .grey
MarkedSubstrings.appearance().markFont = .systemFont(ofSize: 18)
MarkedSubstrings.appearance().markColor = .brown
Форматирует строку (или число) как цену, в соотвествии с заданой локалью, символов валюты и другими параметрами.
Документация
Такие типы как String, Int, Float, Double расширены для соответствия протоколу CurrencyFormatted
и реализуют этот метод
func currency(mainFont: UIFont,
mainColor: UIColor,
locale: Locale,
symbol: String,
prefix: String?,
postfix: String?,
count: Int?,
countFont: UIFont?,
countColor: UIColor?,
minFraction: Int,
maxFraction: Int,
isStriked: Bool) -> NSAttributedString?
Все поля не обязательны и имеют значение по умолчанию. В случае если не удалось распарсить строку как цену, возвращает nil.
Так же протокол CurrencyFormatted
имеет статичный метод:
public static func currencySymbol(for localeIdentifier: String = "ru_RU") -> String
возвращающий символ валюты. Используется как валюта по умолчанию.
Основной метод currency
, преобразует запятые в точки, после чего вырезает из строки все нечисловые символы, кроме минуса (-) и точки (.). Затем форматирует строку.
Точно, в данном случае, служит разделителем целой и дробной частей. Если точек больше 1-ой, то метод вернёт nil.
Входные параметры:
- mainFont: шрифт строки с ценой. По умолчанию системный шрифт системного размера.
- mainColor: цвет строки с ценой. По умолчанию
darkText
цвет. - locale: локаль, в соответствии с правилами которой будет форматироваться цена. По умолчанию - текущая локаль устройства.
- symbol: сивол валюты, который будет использован. По умолчанию - результат выполнения статичной функции
currencySymbol
, возвращающей символ дляru_RU
локали (российский рубль). - prefix: префикс, который будет стоять перед ценой. По умолчанию nil.
- postfix: постфикс, который будет стоять перед ценой. По умолчанию nil.
- count: количество товаров. По умолчанию nil. Если значение будет больше 1, то перед ценой появится это значение + ' x '. Например для значения 3 и цены 100, будет '3 x 100 ₽'
- countFont: шрифт количества товаров. По умолчанию nil и соответствует параметру
font
. - countColor: цвет количества товаров. По умолчанию nil и соответствует параметру
color
. - maxFraction: минимальное количество знаков после запятой. По умолчанию значие 0.
- maxFraction: максимальное количество знаков после запятой. По умолчанию значие 0.
- isStriked: если
true
, то значение цены будет зачёркнуто. По умолчаниюfalse
.
Через Appearance
можно настроить следующие параметры, используя класс CurrencyFormat
:
- mainFont
- mainColor
- locale
- symbol
- prefix
- postfix
- countFont
- countColor
- maxFraction
- maxFraction
Примеры и кейсы использования
let defaultFont = UIFont.systemFont(ofSize: 18)
let defaultColor = UIColor.black
//1.
1234.4345.currency(font: defaultFont, color: defaultColor, maxFraction: 2)
//2.
" - 1 234 рублей.".currency(font: defaultFont, color: .red, prefix: "prefix", postfix: "postfix", isStriked: true)
//3.
"1 2 sd 3 ggdf4 рублей".currency(font: defaultFont, color: defaultColor, count:5)
//4.
let locale = Locale(identifier: "en_US")
let symbol = String.currencySymbol(for: "fr_FR")
"1 234 (тысяча двести тридцать четыре)".currency(font: defaultFont,
color: defaultColor,
locale: locale,
symbol: symbol,
count:2,
countFont: .boldSystemFont(ofSize: 22),
countColor: .blue)
Пример задания свойств через Appearance
:
CurrencyFormat.appearance().mainFont = .systemFont(ofSize: 20)
CurrencyFormat.appearance().mainColor = .grey
CurrencyFormat.appearance().symbol = .currencySymbol(for: "us_US")
CurrencyFormat.appearance().countColor = .red
Проверяет, является ли строка HEX-представление цвета и преобразует в UIColor
, если возможно.
Документация
Структура String
была расширена протоколом ColoredString
, имеющим два свойства:
var isHexColor: Bool { get }
var color: UIColor? { get }
isHexColor
проверяет, является ли строка представление HEX цвета.color
пытается создатьUIColor
обьект из строки. Возвращает nil в случае неудачи.
Поддерживает полный (#FFAA99) и сокращённый (#FA9) форматы. Октоторп (символ #) является не обязательным.
Примеры и кейсы использования
print("\("#FF8822".isHexColor)")
print("\("#FF8822".color!)")
print("\("FF8822".color!)")
Результат:
true
UIExtendedSRGBColorSpace 1 0.533333 0.133333 1
UIExtendedSRGBColorSpace 1 0.533333 0.133333 1
Удаляет из строки, все символы, которые есть в переданно подстроке.
Документация
Структура String
была расширена, и в неё добавлен метод
func removeCharacters(_ list: String, ignoreCase: Bool = false) -> String
Метод удаляет из искомой строки все символы, имеющиеся в переданной подстроке list
Если ignoreCase передан как true, то тогда символы вырезаются независимо от регистра.
Примеры и кейсы использования
let string = "Test with test for test if testing is available."
print("\(string.removeCharacters("teail"))")
print("\(string.removeCharacters("TEAIL", ignoreCase: true))")
Результат:
Ts wh s for s f sng s vb.
s wh s for s f sng s vb.