AnimatableTableView.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. //
  2. // Created by Jake Lin on 12/15/15.
  3. // Copyright © 2015 IBAnimatable. All rights reserved.
  4. //
  5. import UIKit
  6. @IBDesignable
  7. open class AnimatableTableView: UITableView, FillDesignable, BorderDesignable, GradientDesignable,
  8. BackgroundImageDesignable, BlurDesignable, RefreshControlDesignable,
  9. Animatable {
  10. // MARK: - FillDesignable
  11. @IBInspectable open var fillColor: UIColor? {
  12. didSet {
  13. configureFillColor()
  14. }
  15. }
  16. open var predefinedColor: ColorType? {
  17. didSet {
  18. configureFillColor()
  19. }
  20. }
  21. @IBInspectable var _predefinedColor: String? {
  22. didSet {
  23. predefinedColor = ColorType(string: _predefinedColor)
  24. }
  25. }
  26. @IBInspectable open var opacity: CGFloat = CGFloat.nan {
  27. didSet {
  28. configureOpacity()
  29. }
  30. }
  31. // MARK: - BorderDesignable
  32. open var borderType: BorderType = .solid {
  33. didSet {
  34. configureBorder()
  35. }
  36. }
  37. @IBInspectable var _borderType: String? {
  38. didSet {
  39. borderType = BorderType(string: _borderType)
  40. }
  41. }
  42. @IBInspectable open var borderColor: UIColor? {
  43. didSet {
  44. configureBorder()
  45. }
  46. }
  47. @IBInspectable open var borderWidth: CGFloat = CGFloat.nan {
  48. didSet {
  49. configureBorder()
  50. }
  51. }
  52. open var borderSides: BorderSides = .AllSides {
  53. didSet {
  54. configureBorder()
  55. }
  56. }
  57. @IBInspectable var _borderSides: String? {
  58. didSet {
  59. borderSides = BorderSides(rawValue: _borderSides)
  60. }
  61. }
  62. // MARK: - GradientDesignable
  63. open var gradientMode: GradientMode = .linear
  64. @IBInspectable var _gradientMode: String? {
  65. didSet {
  66. gradientMode = GradientMode(string: _gradientMode) ?? .linear
  67. }
  68. }
  69. @IBInspectable open var startColor: UIColor?
  70. @IBInspectable open var endColor: UIColor?
  71. open var predefinedGradient: GradientType?
  72. @IBInspectable var _predefinedGradient: String? {
  73. didSet {
  74. predefinedGradient = GradientType(string: _predefinedGradient)
  75. }
  76. }
  77. open var startPoint: GradientStartPoint = .top
  78. @IBInspectable var _startPoint: String? {
  79. didSet {
  80. startPoint = GradientStartPoint(string: _startPoint, default: .top)
  81. }
  82. }
  83. // MARK: - BackgroundImageDesignable
  84. @IBInspectable open var backgroundImage: UIImage? {
  85. didSet {
  86. configureBackgroundImage()
  87. configureBackgroundBlurEffectStyle()
  88. }
  89. }
  90. // MARK: - BlurDesignable
  91. open var blurEffectStyle: UIBlurEffect.Style? {
  92. didSet {
  93. configureBackgroundBlurEffectStyle()
  94. }
  95. }
  96. @IBInspectable var _blurEffectStyle: String? {
  97. didSet {
  98. blurEffectStyle = UIBlurEffect.Style(string: _blurEffectStyle)
  99. }
  100. }
  101. open var vibrancyEffectStyle: UIBlurEffect.Style? {
  102. didSet {
  103. configureBackgroundBlurEffectStyle()
  104. }
  105. }
  106. @IBInspectable var _vibrancyEffectStyle: String? {
  107. didSet {
  108. vibrancyEffectStyle = UIBlurEffect.Style(string: _vibrancyEffectStyle)
  109. }
  110. }
  111. @IBInspectable open var blurOpacity: CGFloat = CGFloat.nan {
  112. didSet {
  113. configureBackgroundBlurEffectStyle()
  114. }
  115. }
  116. // MARK: - RefreshControlDesignable
  117. @IBInspectable open var hasRefreshControl: Bool = false {
  118. didSet {
  119. configureRefreshController()
  120. }
  121. }
  122. @IBInspectable open var refreshControlTintColor: UIColor? {
  123. didSet {
  124. configureRefreshController()
  125. }
  126. }
  127. @IBInspectable open var refreshControlBackgroundColor: UIColor? {
  128. didSet {
  129. configureRefreshController()
  130. }
  131. }
  132. // MARK: - Animatable
  133. open var animationType: AnimationType = .none
  134. @IBInspectable var _animationType: String? {
  135. didSet {
  136. animationType = AnimationType(string: _animationType)
  137. }
  138. }
  139. @IBInspectable open var autoRun: Bool = true
  140. @IBInspectable open var duration: Double = Double.nan
  141. @IBInspectable open var delay: Double = Double.nan
  142. @IBInspectable open var damping: CGFloat = CGFloat.nan
  143. @IBInspectable open var velocity: CGFloat = CGFloat.nan
  144. @IBInspectable open var force: CGFloat = CGFloat.nan
  145. @IBInspectable var _timingFunction: String = "" {
  146. didSet {
  147. timingFunction = TimingFunctionType(string: _timingFunction)
  148. }
  149. }
  150. open var timingFunction: TimingFunctionType = .none
  151. // MARK: - Lifecycle
  152. open override func prepareForInterfaceBuilder() {
  153. super.prepareForInterfaceBuilder()
  154. configureInspectableProperties()
  155. }
  156. open override func awakeFromNib() {
  157. super.awakeFromNib()
  158. configureInspectableProperties()
  159. }
  160. open override func layoutSubviews() {
  161. super.layoutSubviews()
  162. autoRunAnimation()
  163. configureAfterLayoutSubviews()
  164. }
  165. // MARK: - Private
  166. fileprivate func configureInspectableProperties() {
  167. configureAnimatableProperties()
  168. configureOpacity()
  169. }
  170. fileprivate func configureAfterLayoutSubviews() {
  171. configureBorder()
  172. configureGradient()
  173. }
  174. }