ZZToolKit is a set of custom tools containing extensions to properties of various commonly used classes and some custom components.
Contains various basic methods for obtaining properties```swift /// Цвет public func RGB(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat = 1) -> UIColor @available(iOS 8.2, *) public func FontSize(size: CGFloat, weight: UIFont.Weight) -> UIFont //@available(iOS, introduced: 6.0, deprecated: 8.2) public func FontSize(size: CGFloat) -> UIFont public func FontBoldSize(size: CGFloat) -> UIFont /// UUID public var uuidString: String /// Главное окно public var keyWindow: UIWindow? /// Название телефона public var phoneName: String /// Название устройства public var systemName: String /// Версия системы устройства public var systemVersion: String /// Версия приложения public var appVersion: String /// Build приложения public var appBuild: String /// Название приложения public var appName: String /// Является ли iPhone X public var isIPhoneX: Bool /// Является ли iPhone 5 или ниже public var isIphone5OrLess: Bool /// Является ли iPad public var isIpad: Bool /// Является ли iPhone public var isIphone: Bool /// Является ли темная тема public var isDarkMode: Bool /// Является ли Retina public var isRetina: Bool /// Ширина экрана public var screenWidth: CGFloat /// Высота экрана public var screenHeight: CGFloat /// Наибольшая сторона экрана public var screenMaxLength: CGFloat /// Наименьшая сторона экрана public var screenMinLength: CGFloat /// Отношение сторон экрана public var screenMinScale: CGFloat /// Высота строки состояния public var statusBarHeight: CGFloat /// Высота навигационной панели public let navigationBarHeight: CGFloat /// Дополнительная высота внизу для iPhone X public let safeAreaHeight: CGFloat /// Высота панели TabBar public let tabBarHeight: CGFloat /// Путь к файлу public func fileBundle(name: String, type: String) -> String? /// documents public func fileDocuments() -> String /// Имя файла в documents public func fileDocumentsFilename(_ filename: String) -> String /// Преобразование строки в URL
```markdown
### Расширенные свойства класса
#### 1\. `UIWindow`
```swift
```swift
func visibleViewController() -> UIViewController?
static func getVisibleViewController(from viewCtrl: UIViewController) -> UIViewController
static func getCurrentViewController() -> UIViewController
```#### 2\. UIViewController
```swift
public var naviBarBgImage: UIImage?
public var shadowImage: UIImage?
public var titleColor: UIColor?
public var titleFont: UIFont?
/// Устанавливает верхнее отображаемое окно. Высота будет автоматически корректироваться после установки `zz_headerViewHeight`. Ширина также будет автоматически корректироваться.
var zz_topView: UIView?
/// Высота отображаемого верхнего окна
var zz_topViewHeight: CGFloat
/// Ширина отображаемого верхнего окна
var zz_topViewWidth: CGFloat
/// Высота отображаемого верхнего окна после того как оно выходит за пределы экрана
var zz_topViewShowHeight: CGFloat
/// Признак того, что верхнее окно всегда остается вверху при прокрутке вниз
var isBindingTop: Bool
```#### 4\. `UIAlertController`
```swift
@discardableResult static func show(actions:[UIAlertAction], viewCtrl:UIViewController, view:UIView?, title:String?, message:String?, style:UIAlertController.Style) -> UIAlertController
/// Отображение системного диалогового окна Alert
/// - Параметры:
/// - alert: массив объектов UIAlertAction
/// - viewCtrl: контроллер для вызова метода presentViewController
/// - view: положение отображения
/// - title: заголовок
/// - message: сообщение
static func show(alert:[UIAlertAction], viewCtrl:UIViewController, view:UIView?, title:String?, message:String?)
/// Отображение системного диалогового окна Alert
/// - Параметры:
/// - title: заголовок
/// - message: сообщение
/// - okTitle: заголовок кнопки "OK"
/// - handler: обработчик события нажатия кнопки
static func show(title: String?, message: String?, okTitle: String?, handler: ((UIAlertAction) -> Void)? = nil)
/// Отображение системного ActionSheet
/// - Параметры:
/// - actionSheet: массив объектов UIAlertAction
/// - viewCtrl: контроллер для вызова метода presentViewController
/// - view: положение отображения
/// - title: заголовок
/// - message: содержание
static func show(actionSheet:[UIAlertAction], viewCtrl:UIViewController, view:UIView?, title:String?, message:String?)
/// Отображение системного окна
/// - Параметры:
/// - titles: данные объектов кнопок titles
/// - viewCtrl: контроллер для вызова метода presentViewController
/// - view: положение отображения
/// - title: заголовок
/// - message: содержание
/// - style: стиль
/// - titleBlock: callback для titles Обработка названий кнопок внутри titles
/// - clickBlock: вызывается при клике на кнопку выбора
``````markdown
#### 5\. NSString
var md5: String
var lastString: String
var firstString: String
func substring(from index: Int) -> String
func substring(to index: Int) -> String
func substring(range index: NSRange) -> String
func hidden(range index: NSRange, replace: String = "*") -> String
func jsonFormatPrint() -> String
func intValue() -> Int
/// Проверяет, является ли строка номером телефона
func isPhone() -> Bool
/// Проверяет, является ли строка городским телефоном
##### Отображает системное окно
###### Параметры:
- **titles**: данные объектов кнопок titles
- **viewCtrl**: `presentViewController`
- **view**: позиция отображения
- **title**: заголовок
- **message**: содержание
- **style**: стиль
- **titleBlock**: callback для titles; обработка названий кнопок внутри titles
- **clickBlock**: вызывается при клике на кнопку выбора
##### Отображает Alert без кнопок
###### Параметры:
- **showTime**: если равно `nil`, то автоматически скрывается через 2 секунды после открытия
``` func isTelPhone() -> Bool
/// Проверяет, является ли строка номером телефона
func isIdCard() -> Bool
/// Проверяет, является ли строка номером паспорта
func isCode_6() -> Bool
/// Проверяет, является ли строка шестизначным кодом
func isLength(minLength:Int, maxLength:Int) -> Bool#### 6\. UIImage
/// Получает изображение UIImage. init(named: name)
static func named(name: String) -> UIImage?
/// Получает изображение name(String) -> UIImage?
static func name(_ name: String) -> UIImage?
/// Преобразует Base64-строку в изображение
static func base64(base64: String) -> UIImage?
/// Создает изображение размером {1,1} с указанным цветом
///
/// - Parameter color: Цвет изображения
/// - Returns: Изображение указанного цвета
static func image(color: UIColor) -> UIImage
/// Создает изображение размером {1,1} с указанным цветом
///
/// - Parameter color: Цвет изображения
/// - Returns: Изображение указанного цвета
static func imageWithColor(_ color: UIColor) -> UIImage
/// Создает изображение с указанным цветом и размером
///
/// - Parameters:
/// - color: Цвет изображения
/// - size: Размер изображения
/// - Returns: Изображение указанного цвета и размера
static func image(color: UIColor, size: CGSize) -> UIImage?
/// Создает скриншот окна
///
/// - Parameters:
/// - fromView: Окно
/// - atFrame: Область скриншота
/// - Returns: Скриншот
static func getSnapshot(_ fromView: UIView?, atFrame: CGRect) -> UIImage?
/// Изменяет цвет изображения
func imageWithColor(_ color: UIColor) -> UIImage?
/// Изменяет цвет изображения с использованием режима смешивания
func imageWithTintColor(_ color: UIColor, blendMode: CGBlendMode) -> UIImage?
/// Устанавливает закругленные углы для изображения
func roundImage(byRoundingCorners: UIRectCorner = UIRectCorner.allCorners, cornerRadius: CGFloat) -> UIImage?
/// Изменение изображения на закругленное
func roundImage(byRoundingCorners: UIRectCorner = UIRectCorner.allCorners, cornerRadii: CGSize) -> UIImage?
///
/// - Возвращает: горизонтально отражённое `UIImage`
func flipImage() -> UIImage
/// Поворот на 90° вправо ⤼
func rotateRight90() -> UIImage
/// Установка ориентации изображения
func orientation(_ orientation: UIImage.Orientation) -> UIImage
/**
* Пропорциональное масштабирование
*/
func scaleImage(scaleSize: CGFloat) -> UIImage?
/**
* Переопределение размера изображения
*/
func resizeImage(resize: CGSize) -> UIImage?
/// Сжатие данных изображения без изменения размера
///
/// - Параметры:
/// - maxLength: максимальная длина
/// - Возвращает:
func compressImageOnLength(maxLength: Int) -> Data?
/// Сжатие изображения
///
/// - Параметры:
/// - maxLength: максимальное количество байтов после сжатия
/// - Возвращает: данные сжатого изображения
func compressImageMid(maxLength: Int) -> Data?
/// Сжатие изображения
///
/// - Параметры:
/// - maxLength: максимальное количество байтов после сжатия
/// - Возвращает: сжатое изображение
func compressImage(maxLength: Int) -> UIImage?
/// Создание нового изображения по заданному размеру
///
/// - Параметры:
/// - size: заданный размер
/// - Возвращает: новое изображение
func imageWithNewSize(size: CGSize) -> UIImage?
/// Наложение текста на изображение
func add(text: String, attributed: [NSAttributedString.Key : Any], scale: CGFloat) -> UIImage #### 7\. Дата <br>
static func comps(type: Calendar.Component, date: Date = Date()) -> Int
static func year(date: Date = Date()) -> Int
static func month(date: Date = Date()) -> Int
static func day(date: Date = Date()) -> Int
static func hour(date: Date = Date()) -> Int
static func minute(date: Date = Date()) -> Int
static func second(date: Date = Date()) -> Int
static func weekday(date: Date = Date()) -> Int
/// Количество дней в месяце
func monthTotalDays(calendar: Calendar = Calendar.current) -> Int
/// Получение даты с смещением на указанное число дней
func year(offset: Int, calendar: Calendar = Calendar.current) -> Date?
/// Получение даты с смещением на указанное число месяцев
func month(offset: Int, calendar: Calendar = Calendar.current) -> Date?
/// Получает дату с учетом указанного смещения в месяцах. Например, offset = 1 указывает на дату через один месяц, offset = -1 — на дату за один месяц назад; день, час и так далее аналогично.
func day(offset: Int, calendar: Calendar = Calendar.current) -> Date?
/// Получает дату с учетом указанного смещения в днях.
func dateString(with formatterStr: String, calendar: Calendar.Identifier? = nil) -> String
/// Преобразует дату в строку с использованием указанного формата.
static func date(with dateStr: String, formatter: String = "yyyy-MM-dd", calendar: Calendar.Identifier? = nil) -> Date?
/// Преобразует строку в дату с использованием указанного формата.
func equal(day: Date) -> Bool
/// Проверяет равенство двух дат по году, месяцу и дню.
var year: String
/// Год.
var month: String
/// Месяц.
var day: String
/// День.
var hour: String
/// Час.
var minute: String
/// Минуты.
var seconds: String
/// Секунды.
var weekDay: Int
/// Номер дня недели.
var isToday: Bool
/// Является ли текущий день сегодняшним днём.#### 8. Базовые свойства `UIView` и методы для установки и получения значений, а также использование цепочки вызовов для удобства работы```swift
var x: CGFloat
/// Координата X.
var y: CGFloat
/// Координата Y.
var width: CGFloat
/// Ширина.
var height: CGFloat
/// Высота.
var maxX: CGFloat
/// Максимальная координата X.
var maxY: CGFloat
/// Максимальная координата Y.
var size: CGSize
/// Размер.
var origin: CGPoint
/// Начальная точка.
var centerX: CGFloat
/// Центральная координата X.
var centerY: CGFloat
/// Центральная координата Y.
var borderColor: UIColor
/// Цвет границы.
var borderWidth: CGFloat
/// Ширина границы.
var cornerRadius: CGFloat
/// Радиус закругления углов.
var masksToBounds: Bool
/// Установка маскировки границ.
@discardableResult
func border(width: CGFloat = 0.5, color: UIColor = .gray, radius: CGFloat? = nil) -> Self
/// Устанавливает ширину, цвет и радиус границы.
@discardableResult
func isUserInteractionEnabled(_ enable: Bool) -> Self
/// Включает/выключает возможность взаимодействия пользователя.
@discardableResult
func isHidden(_ enable: Bool) -> Self
/// Скрывает/показывает элемент.
func removeAllSubViews()
/// Удаляет все подэлементы.
func remove(subViews: [UIView]) -> Void
/// Удаляет выбранные подэлементы.
func findSubView<T: UIView>(_ classType: T.Type, recursion: Bool) -> T?
/// Находит подэлемент типа T.
@objc
func isHave(view: UIView) -> Bool
/// Проверяет наличие подэлемента.
@objc
private func isHave(view: UIView, in superView: UIView) -> Bool
/// Внутренний метод проверки наличия подэлемента.
@objc func addGradientLayer(from fColor: UIColor, to toColor: UIColor, start startPoint: CGPoint, end endPoint: CGPoint)
/// Добавляет градиентный слой с правого края налево
@objc func addGradientLayer(from fColor: UIColor, to toColor: UIColor)
///
@objc @discardableResult func addLine(frame: CGRect, color: UIColor) -> UIView
///
@objc @discardableResult func addLine(_ color: UIColor = DefaultborderColor, layout: ((view: UIView) -> ()) ) -> UIView
///
В этом примере были исправлены знаки препинания и пробелы перед ключевыми словами. Также были переведены комментарии. @discardableResult @objc func addLine(size: CGFloat, alignment: UIView.ContentMode, color: UIColor) -> UIView
/// Частично закругленные углы
///
/// - Parameters:
/// - corners: Углы, которые должны быть закруглены; можно передать несколько значений
/// - radii: Радиус закругления
@discardableResult
@objc func addRound(_ corners: UIRectCorner, radii: CGFloat) -> Self#### 9\. UIColor
@objc static func hexColor(hexStr: String, alpha: CGFloat) -> UIColor
/// HEX цвет
@objc static func hexColor(hexStr: String) -> UIColor
/// HEX цвет
@objc static func hexStr(_ hexStr: String) -> UIColor
/// Получение RGB значения цвета
func getRGB() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)
/// Изменение прозрачности цвета
@objc static func changeAlpha(color: UIColor, alpha: CGFloat) -> UIColor
/// Изменение прозрачности цвета
@objc func changeAlpha(_ alpha: CGFloat) -> UIColor
mutating func append(dic: Dictionary) -> Void
/// Добавление события
@discardableResult
func addBlock(for events: UIControlEvents, block: @escaping ((sender: Any) -> Void)) -> Self
@discardableResult
func addTarget(for controlEvents: UIControlEvents, target: Any?, action: Selector) -> Self
/// Удаление события, связанного с блоком
@discardableResult
func removeBlockTarget(for events: UIControlEvents) -> Self
/// Удаление всех событий нажатия
@discardableResult
func removeAllTargets() -> Self
@discardableResult
@objc dynamic func isEnabled(_ enabled: Bool) -> Self
@discardableResult
@objc dynamic func isSelected(_ selected: Bool) -> Self
func addObservers(keyPaths: [String], key: String = "", options: NSKeyValueObservingOptions = [.old, .new], block: @escaping ObserverBlockTargetAlias)
func removeAllSublayers()
var size: CGSize
var center: CGPoint
```#### 14. Методы цепочечной записи UILabel
var lineHeight: CGFloat
* Установка высоты строки
```swift
@discardableResult
func lineHeight(_ value: CGFloat) -> Self
@discardableResult func font(_ font: UIFont) -> Self
* Установка атрибутированного текста
```swift
@discardableResult
func attributedText(_ value: NSAttributedString?) -> Self
@discardableResult func numberOfLines(_ value: Int) -> Self
* Установка режима переноса строки
```swift
@discardableResult
func lineBreakMode(_ value: NSLineBreakMode) -> Self
@discardableResult func textColor(_ color: UIColor) -> Self
* Установка выравнивания текста
```swift
@discardableResult
func textAlignment(_ alignment: NSTextAlignment) -> Self
@discardableResult func text(_ text: String?) -> Self
* Регистрация ячейки
```swift
@discardableResult
func register<T>(cell cellClass: T.Type, nibName: String? = nil, identifier: String = "\(NSStringFromClass(T.self))_identifier") -> Self
@discardableResult func register(headerFooter cellClass: T.Type, nibName: String? = nil, identifier: String = "(NSStringFromClass(T.self))_identifier") -> Self
* Получение стандартной ячейки
```swift
func defaultCell(_ style: UITableViewCell.CellStyle = .default, initBlock: ((_: UITableViewCell) -> Void)? = nil) -> UITableViewCell
func cellT(identifier: String = "(NSStringFromClass(T.self))_identifier", cellClass: T.Type, for indexPath: IndexPath) -> T
* Получение ячейки с указанием идентификатора и стиля
```swift
func cellT<T : UITableViewCell>(identifier: String = "\(NSStringFromClass(T.self))_identifier", cellClass: T.Type, style: UITableViewCell.CellStyle = .default, initBlock: ((_: T) -> Void)? = nil) -> T
func headerFooterView(identifier: String = "(NSStringFromClass(T.self))HeaderFooter_identifier", headerFooterClass: T.Type, initBlock: ((_: T) -> Void)? = nil) -> T
```#### 16. Реализация быстрой регистрации и получения элементов UICollectionView
```swift
@discardableResult
func register<T>(cell cellClass: T.Type, nibName: String? = nil, identifier: String = "\(NSStringFromClass(T.self))_identifier") -> Self
@discardableResult
func register<T>(header headerClass: T.Type, nibName: String? = nil, identifier: String = "\(NSStringFromClass(T.self))_identifier") -> Self
@discardableResult
func register<T>(footer footerClass: T.Type, nibName: String? = nil, identifier: String = "\(NSStringFromClass(T.self))_identifier") -> Self
``````markdown
### Пользовательские компоненты
#### 1、ZZScrollView

`ZZScrollView` наследуется от `UIScrollView`, что позволяет связывать произвольные пользовательские компоненты в цепочку и обеспечивает плавное вертикальное прокручивание. Например, можно объединять такие компоненты как `UIView`, `UITableView`, `WKWebView`, `UIScrollView`, `UICollectionView` и так далее в любых сочетаниях. В реальных условиях это может применяться, например, для реализации страницы с новостью, где верхняя часть — это шапка новостной рубрики, средняя часть — это содержание новости в виде веб-страницы, а нижняя часть — это раздел с комментариями. Это позволяет быстро создать такую страницу без необходимости вычисления высоты прокрутки каждого компонента.
Способ использования:
``````swift
let customItem1 = ZZScrollView.Item(view: customView1, maxHeight: 268)
let customItem2 = ZZScrollView.Item(view: customView2)
let scrollItem1 = ZZScrollView.Item(view: scrollView1)
let scrollItem2 = ZZScrollView.Item(view: scrollView2)
let webItem1 = ZZScrollView.Item(view: webView1)
let webItem2 = ZZScrollView.Item(view: webView3)
let zzScrollView = ZZScrollView(items: [customItem1, scrollItem1, webItem1, webItem2, scrollItem2, customItem2])
private(set) public var minHeight: CGFloat = 0
private(set) public var maxHeight: CGFloat = 0 // Эффективно при условии, что view не является UIScrollView или её подклассами
private(set) public var fixedWidth: CGFloat = 0 // Конфликтует с inset. При положительном значении inset.left и inset.right становятся недействительными
private(set) public var view: UIView!
@objc public dynamic var inset: UIEdgeInsets = .zero
@objc private(set) public dynamic var contentSize: CGSize = .zero
@objc private(set) public dynamic var isHidden: Bool = false
```#### 2\. ZZUIButton

ContentAlignment


ImageAlignment


ZZUIButton позволяет свободно устанавливать позицию изображения и способ выравнивания содержимого. Можно произвольно выровнять изображение относительно содержимого.
Использование:
```swift
let button = ZZUIButton()
button.backgroundColor(color: .red, state: .normal)
.backgroundColor(color: .blue, state: .highlighted)
.backgroundColor(color: .orange, state: .selected)
.backgroundColor(color: .yellow, state: .disabled)
.title(title: "normal", state: .normal)
.title(title: "highlighted", state: .highlighted)
.title(title: "selected", state: .selected)
.title(title: "disabled", state: .disabled)
.image(image: UIImage(named: "icon_timeout"), state: .normal)
.title(title: title, state: .normal)
.contentAlignment(contentAlignment) // Выравнивание содержимого
.imageAlignment(imageAlignment) // Выравнивание изображения относительно содержимого
.space(20)
.contentViewBgColor(color: .green, state: .normal)
.contentInset(UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
Способ использования аналогичен системному UIPageControl. В нём добавлены способы выравнивания, более удобное установление изображений и получение номера страницы.```swift @IBInspectable open var numberOfPages: Int = 0
```swift
@IBInspectable open var currentPage: Int = 0
@IBInspectable open var pageImage: UIImage?
@IBInspectable open var currentPageImage: UIImage?
@IBInspectable open var alignment: PageControlAlignment = .Center
@IBInspectable open var pageIndicatorTintColor: UIColor?
@IBInspectable open var currentPageIndicatorTintColor: UIColor?
@IBInspectable open var pageSpace: CGFloat = 6
``` Варианты выравнивания:<br>
enum PageControlAlignment : Int {
case Center, Left, Right
}
Пример использования:<br>
let view = ZZPageControl()
view.numberOfPages = 8
view.currentPage = 0
view.pageImage = pageImage
view.currentPageImage = pageImage
view.alignment = alignment
view.pageIndicatorTintColor = pageIndicatorTintColor
view.currentPageIndicatorTintColor = currentPageIndicatorTintColor
view.pageSpace = 10
view.indicatorSize = CGSize(width: 20, height: 15)
#### 4\. ZZBannerView<br>

Элемент для отображения баннера с возможностью циклической прокрутки и добавлением пользовательских View<br>
Пример использования:<br>
let view = ZZBannerView()
view.createBannerImagesBlock = { page, imageView, object in
imageView.backgroundColor = UIColor.lightGray
imageView.cornerRadius(10)
imageView.contentMode = .scaleAspectFill
}
view.isAutoRun = true
view.isCycleRunBanner = true
view.masksToBounds(true)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )