IB.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //
  2. // IB.swift
  3. // IBAnimatableApp
  4. //
  5. // Created by Tom Baranes on 17/01/2018.
  6. // Copyright © 2018 IBAnimatable. All rights reserved.
  7. //
  8. import Foundation
  9. public final class IB: NSObject, CornerDesignable, FillDesignable, BorderDesignable,
  10. RotationDesignable, ShadowDesignable, BlurDesignable,
  11. GradientDesignable, MaskDesignable {
  12. private let view: UIView
  13. // MARK: Life cycle
  14. fileprivate init(view: UIView) {
  15. self.view = view
  16. super.init()
  17. }
  18. public func reload() {
  19. configureMask(in: view, previousMaskType: maskType)
  20. configureCornerRadius(in: view)
  21. configureBorder(in: view)
  22. configureMaskShadow(in: view)
  23. }
  24. // MARK: - CornerDesignable
  25. public var cornerRadius: CGFloat = CGFloat.nan {
  26. didSet {
  27. configureCornerRadius(in: view)
  28. }
  29. }
  30. public var cornerSides: CornerSides = .allSides {
  31. didSet {
  32. configureCornerRadius(in: view)
  33. }
  34. }
  35. // MARK: - FillDesignable
  36. public var fillColor: UIColor? {
  37. didSet {
  38. configureFillColor(in: view)
  39. }
  40. }
  41. public var predefinedColor: ColorType? {
  42. didSet {
  43. configureFillColor(in: view)
  44. }
  45. }
  46. public var opacity: CGFloat = CGFloat.nan {
  47. didSet {
  48. configureOpacity(in: view)
  49. }
  50. }
  51. // MARK: - BorderDesignable
  52. public var borderType: BorderType = .solid {
  53. didSet {
  54. configureBorder(in: view)
  55. }
  56. }
  57. public var borderColor: UIColor? {
  58. didSet {
  59. configureBorder(in: view)
  60. }
  61. }
  62. public var borderWidth: CGFloat = CGFloat.nan {
  63. didSet {
  64. configureBorder(in: view)
  65. }
  66. }
  67. public var borderSides: BorderSides = .AllSides {
  68. didSet {
  69. configureBorder(in: view)
  70. }
  71. }
  72. // MARK: - RotationDesignable
  73. public var rotate: CGFloat = CGFloat.nan {
  74. didSet {
  75. configureRotate(in: view)
  76. }
  77. }
  78. // MARK: - ShadowDesignable
  79. public var shadowColor: UIColor? {
  80. didSet {
  81. configureShadowColor(in: view)
  82. }
  83. }
  84. public var shadowRadius: CGFloat = CGFloat.nan {
  85. didSet {
  86. configureShadowRadius(in: view)
  87. }
  88. }
  89. public var shadowOpacity: CGFloat = CGFloat.nan {
  90. didSet {
  91. configureShadowOpacity(in: view)
  92. }
  93. }
  94. public var shadowOffset: CGPoint = CGPoint(x: CGFloat.nan, y: CGFloat.nan) {
  95. didSet {
  96. configureShadowOffset(in: view)
  97. }
  98. }
  99. // MARK: - BlurDesignable
  100. public var blurEffectStyle: UIBlurEffect.Style? {
  101. didSet {
  102. configureBlurEffectStyle(in: view)
  103. }
  104. }
  105. public var vibrancyEffectStyle: UIBlurEffect.Style? {
  106. didSet {
  107. configureBlurEffectStyle(in: view)
  108. }
  109. }
  110. public var blurOpacity: CGFloat = CGFloat.nan {
  111. didSet {
  112. configureBlurEffectStyle(in: view)
  113. }
  114. }
  115. // MARK: - GradientDesignable
  116. public var gradientMode: GradientMode = .linear {
  117. didSet {
  118. configureGradient(in: view)
  119. }
  120. }
  121. public var startColor: UIColor? {
  122. didSet {
  123. configureGradient(in: view)
  124. }
  125. }
  126. public var endColor: UIColor? {
  127. didSet {
  128. configureGradient(in: view)
  129. }
  130. }
  131. public var predefinedGradient: GradientType? {
  132. didSet {
  133. configureGradient(in: view)
  134. }
  135. }
  136. public var startPoint: GradientStartPoint = .top {
  137. didSet {
  138. configureGradient(in: view)
  139. }
  140. }
  141. // MARK: - MaskDesignable
  142. public var maskType: MaskType = .none {
  143. didSet {
  144. configureMask(in: view, previousMaskType: oldValue)
  145. configureBorder(in: view)
  146. configureMaskShadow(in: view)
  147. }
  148. }
  149. }
  150. // MARK: -
  151. private struct AssociatedKeys {
  152. static var ib = "IBAnimatable"
  153. }
  154. extension UIView {
  155. public var ib: IB {
  156. get {
  157. var ibValue = objc_getAssociatedObject(self, &AssociatedKeys.ib) as? IB
  158. if ibValue == nil {
  159. ibValue = IB(view: self)
  160. self.ib = ibValue!
  161. }
  162. return ibValue!
  163. }
  164. set {
  165. objc_setAssociatedObject(self, &AssociatedKeys.ib, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  166. }
  167. }
  168. }