SHARE
TWEET

Untitled

a guest Oct 21st, 2019 86 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import UIKit
  2.  
  3. /// Протокол определяющий сетку по которой верстаются визуальный компоненты
  4. /// Опередление кастомных размеров в Appearance допускается только в исключительных случаях
  5. ///
  6. /// Пример:
  7. /// extension MyModuleView {
  8. ///     struct Appearance: Grid { }
  9. /// }
  10. ///
  11. /// class MyModuleView: UIView {
  12. ///     let appearance = Appearance()
  13. ///     lazy var subview = UIView()
  14. ///
  15. ///     private func makeConstraints() {
  16. ///         subview.snp.makeConstraints { (make) in
  17. ///             make.top.left.right.equalToSuperview().inset(appearance.xxlInsets)
  18. ///             make.height.equalTo(appearance.xxlSize)
  19. ///             make.top.equalTo(previousSubview.snp.bottom).inset(appearance.xxsSpace)
  20. ///         }
  21. ///     }
  22. /// }
  23. public protocol Grid {
  24.     /// Размер минимального элемента сетки
  25.     static var gridUnitSize: CGSize { get }
  26. }
  27.  
  28. // MARK: - Cетки для верстки по умолчанию
  29.  
  30. public extension Grid {
  31.     /// Значение минимального размера сетки по умолчанию
  32.     static var gridUnitSize: CGSize { return CGSize(4) }
  33.    
  34.     // MARK: Grid multipliers
  35.    
  36.     /// = 1
  37.     static var xxxs: CGFloat { return 1 }
  38.     /// = 2
  39.     static var xxs: CGFloat { return 2 }
  40.     /// = 3
  41.     static var xs: CGFloat { return 3 }
  42.     /// = 4
  43.     static var s: CGFloat { return 4 }
  44.     /// = 6
  45.     static var m: CGFloat { return 6 }
  46.     /// = 8
  47.     static var l: CGFloat { return 8 }
  48.     /// = 9
  49.     static var xl: CGFloat { return 9 }
  50.     /// = 12
  51.     static var xxl: CGFloat { return 12 }
  52.     /// = 18
  53.     static var xxxl: CGFloat { return 18 }
  54.    
  55.     /// {4, 4, 4, 4},  если gridUnitSize не переопределён
  56.     var xxxsInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.xxxs }
  57.     /// {8, 8, 8, 8},  если gridUnitSize не переопределён
  58.     var xxsInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.xxs }
  59.     /// {12, 12, 12, 12},  если gridUnitSize не переопределён
  60.     var xsInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.xs }
  61.     /// {16, 16, 16, 16},  если gridUnitSize не переопределён
  62.     var sInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.s }
  63.     /// {24, 24, 24, 24},  если gridUnitSize не переопределён
  64.     var mInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.m }
  65.     /// {32, 32, 32, 32},  если gridUnitSize не переопределён
  66.     var lInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.l }
  67.     /// {36, 36, 36, 36},  если gridUnitSize не переопределён
  68.     var xlInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.xl }
  69.     /// {48, 48, 48, 48},  если gridUnitSize не переопределён
  70.     var xxlInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.xxl }
  71.     /// {72, 72, 72, 72},  если gridUnitSize не переопределён
  72.     var xxxlInsets: UIEdgeInsets { return UIEdgeInsets(Self.gridUnitSize) * Self.xxxl }
  73.    
  74.     /// = 4,  если gridUnitSize не переопределён
  75.     var xxxsSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.xxxs) }
  76.     /// = 8,  если gridUnitSize не переопределён
  77.     var xxsSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.xxs) }
  78.     /// = 12,  если gridUnitSize не переопределён
  79.     var xsSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.xs) }
  80.     /// = 16,  если gridUnitSize не переопределён
  81.     var sSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.s) }
  82.     /// = 24,  если gridUnitSize не переопределён
  83.     var mSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.m) }
  84.     /// = 32,  если gridUnitSize не переопределён
  85.     var lSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.l) }
  86.     /// = 36,  если gridUnitSize не переопределён
  87.     var xlSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.xl) }
  88.     /// = 48,  если gridUnitSize не переопределён
  89.     var xxlSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.xxl) }
  90.     /// = 72,  если gridUnitSize не переопределён
  91.     var xxxlSpace: CGFloat { return Self.gridUnitSize.height * CGFloat(Self.xxxl) }
  92.    
  93.     /// {4, 4},  если gridUnitSize не переопределён
  94.     var xxxsSize: CGSize { return Self.gridUnitSize * Self.xxxs }
  95.     /// {8, 8},  если gridUnitSize не переопределён
  96.     var xxsSize: CGSize { return Self.gridUnitSize * Self.xxs }
  97.     /// {12, 12},  если gridUnitSize не переопределён
  98.     var xsSize: CGSize { return Self.gridUnitSize * Self.xs }
  99.     /// {16, 16},  если gridUnitSize не переопределён
  100.     var sSize: CGSize { return Self.gridUnitSize * Self.s }
  101.     /// {24, 24},  если gridUnitSize не переопределён
  102.     var mSize: CGSize { return Self.gridUnitSize * Self.m }
  103.     /// {32, 32},  если gridUnitSize не переопределён
  104.     var lSize: CGSize { return Self.gridUnitSize * Self.l }
  105.     /// {36, 36},  если gridUnitSize не переопределён
  106.     var xlSize: CGSize { return Self.gridUnitSize * Self.xl }
  107.     /// {48, 48},  если gridUnitSize не переопределён
  108.     var xxlSize: CGSize { return Self.gridUnitSize * Self.xxl }
  109.     /// {72, 72},  если gridUnitSize не переопределён
  110.     var xxxlSize: CGSize { return Self.gridUnitSize * Self.xxxl }
  111.    
  112.     /// {4, 4},  если gridUnitSize не переопределён
  113.     var xxxsOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.xxxs }
  114.     /// {8, 8},  если gridUnitSize не переопределён
  115.     var xxsOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.xxs }
  116.     /// {12, 12},  если gridUnitSize не переопределён
  117.     var xsOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.xs }
  118.     /// {16, 16},  если gridUnitSize не переопределён
  119.     var sOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.s }
  120.     /// {24, 24},  если gridUnitSize не переопределён
  121.     var mOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.m }
  122.     /// {32, 32},  если gridUnitSize не переопределён
  123.     var lOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.l }
  124.     /// {36, 36},  если gridUnitSize не переопределён
  125.     var xlOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.xl }
  126.     /// {48, 48},  если gridUnitSize не переопределён
  127.     var xxlOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.xxl }
  128.     /// {72, 72},  если gridUnitSize не переопределён
  129.     var xxxlOffset: UIOffset { return UIOffset(Self.gridUnitSize) * Self.xxxl }
  130.    
  131.     /// Размер пикселя, в зависимости от scale экрана
  132.     var pixelSize: CGFloat { return 1 / UIScreen.main.scale }
  133. }
  134.  
  135. public extension CGSize {
  136.     /// Инициализирует струтуру с идентичными размерами по высоте и ширине, равными входящему параметру
  137.     ///
  138.     /// - Parameter size: размер с которым нужно инициализировать структуру
  139.     init(_ size: CGFloat) {
  140.         self.init(width: size, height: size)
  141.     }
  142.    
  143.     /// Умножает все элементы структуры на множитель
  144.     ///
  145.     /// - Parameters:
  146.     ///   - lhs: исходная структура CGSize
  147.     ///   - rhs: множитель
  148.     /// - Returns: результат умножения всех элементов на множитель
  149.     static func * (lhs: CGSize, rhs: CGFloat) -> CGSize {
  150.         return CGSize(width: lhs.width * rhs, height: lhs.height * rhs)
  151.     }
  152. }
  153.  
  154. extension UIOffset {
  155.     /// Инициализирует структуру с отсутапми равными ширине и высоте входящего параметра
  156.     ///
  157.     /// - Parameter size: размер с которым нужно инициализировать структуру
  158.     init(_ size: CGSize) {
  159.         self.init(horizontal: size.width, vertical: size.height)
  160.     }
  161.    
  162.     /// Умножает все элементы структуры на множитель
  163.     ///
  164.     /// - Parameters:
  165.     ///   - lhs: исходная структура UIOffset
  166.     ///   - rhs: множитель
  167.     /// - Returns: результат умножения всех элементов на множитель
  168.     static func * (lhs: UIOffset, rhs: CGFloat) -> UIOffset {
  169.         return UIOffset(horizontal: lhs.horizontal * rhs, vertical: lhs.vertical * rhs)
  170.     }
  171. }
  172.  
  173. public extension UIEdgeInsets {
  174.     /// Инициализирует структуру с попарно одинаковыми отсутапми, сверху и снизу равными высоте, слева и справа — ширине
  175.     ///
  176.     /// - Parameter size: высота и ширина отступов
  177.     init(_ size: CGSize) {
  178.         self.init(top: size.height, left: size.width, bottom: size.height, right: size.width)
  179.     }
  180.    
  181.     /// Умножает все элементы структуры на множитель
  182.     ///
  183.     /// - Parameters:
  184.     ///   - lhs: исходная структура UIEdgeInsets
  185.     ///   - rhs: множитель
  186.     /// - Returns: результат умножения всех элементов на множитель
  187.     static func * (lhs: UIEdgeInsets, rhs: CGFloat) -> UIEdgeInsets {
  188.         return UIEdgeInsets(top: lhs.top * rhs, left: lhs.left * rhs, bottom: lhs.bottom * rhs, right: lhs.right * rhs)
  189.     }
  190.    
  191.     /// Инициализирует структуру с заданными вертикальными и горизонтальными отступами
  192.     init(vertical: CGFloat = 0, horizontal: CGFloat = 0) {
  193.         self.init(top: vertical, left: horizontal, bottom: vertical, right: horizontal)
  194.     }
  195.    
  196.     /// Инициализирует структуру с равными по всем сторонам отступами
  197.     init(uniform: CGFloat) {
  198.         self.init(top: uniform, left: uniform, bottom: uniform, right: uniform)
  199.     }
  200.    
  201.     /// Возвращает новую структуру с заданным отступом сверху
  202.     func with(top: CGFloat) -> UIEdgeInsets {
  203.         var inset = self
  204.         inset.top = top
  205.         return inset
  206.     }
  207.    
  208.     /// Возвращает новую структуру с заданным отступом слева
  209.     func with(left: CGFloat) -> UIEdgeInsets {
  210.         var inset = self
  211.         inset.left = left
  212.         return inset
  213.     }
  214.    
  215.     /// Возвращает новую структуру с заданным отступом снизу
  216.     func with(bottom: CGFloat) -> UIEdgeInsets {
  217.         var inset = self
  218.         inset.bottom = bottom
  219.         return inset
  220.     }
  221.    
  222.     /// Возвращает новую структуру с заданным отступом справа
  223.     func with(right: CGFloat) -> UIEdgeInsets {
  224.         var inset = self
  225.         inset.right = right
  226.         return inset
  227.     }
  228.    
  229.     /// Возвращает новую структуру с нулевым верхним отступом
  230.     func withoutTop() -> UIEdgeInsets { return with(top: 0) }
  231.    
  232.     /// Возвращает новую структуру с нулевым левым отступом
  233.     func withoutLeft() -> UIEdgeInsets { return with(left: 0) }
  234.    
  235.     /// Возвращает новую структуру с нулевым нижним отступом
  236.     func withoutBottom() -> UIEdgeInsets { return with(bottom: 0) }
  237.    
  238.     /// Возвращает новую структуру с нулевым правым отступом
  239.     func withoutRight() -> UIEdgeInsets { return with(right: 0) }
  240. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top