Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.06 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement