SideImageDesignable.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // Created by Jake Lin on 12/8/15.
  3. // Copyright © 2015 IBAnimatable. All rights reserved.
  4. //
  5. import UIKit
  6. /// Protocol for designing side image
  7. public protocol SideImageDesignable: class {
  8. /**
  9. * The left image
  10. */
  11. var leftImage: UIImage? { get set }
  12. /**
  13. * Left padding of the left image, default value is CGFloat.nan
  14. */
  15. var leftImageLeftPadding: CGFloat { get set }
  16. /**
  17. * Right padding of the left image, default value is CGFloat.nan
  18. */
  19. var leftImageRightPadding: CGFloat { get set }
  20. /**
  21. * Top padding of the left image, default value is CGFloat.nan
  22. */
  23. var leftImageTopPadding: CGFloat { get set }
  24. /**
  25. * The right image
  26. */
  27. var rightImage: UIImage? { get set }
  28. /**
  29. * Left padding of the right image, default value is CGFloat.nan
  30. */
  31. var rightImageLeftPadding: CGFloat { get set }
  32. /**
  33. * Right padding of the right image, default value is CGFloat.nan
  34. */
  35. var rightImageRightPadding: CGFloat { get set }
  36. /**
  37. * Top padding of the right image, default value is CGFloat.nan
  38. */
  39. var rightImageTopPadding: CGFloat { get set }
  40. }
  41. public extension SideImageDesignable where Self: UITextField {
  42. func configureImages() {
  43. configureLeftImage()
  44. configureRightImage()
  45. }
  46. }
  47. fileprivate extension SideImageDesignable where Self: UITextField {
  48. func configureLeftImage() {
  49. guard let leftImage = leftImage else {
  50. return
  51. }
  52. let sideView = makeSideView(with: leftImage,
  53. leftPadding: leftImageLeftPadding,
  54. rightPadding: leftImageRightPadding,
  55. topPadding: leftImageTopPadding)
  56. leftViewMode = .always
  57. leftView = sideView
  58. }
  59. func configureRightImage() {
  60. guard let rightImage = rightImage else {
  61. return
  62. }
  63. let sideView = makeSideView(with: rightImage,
  64. leftPadding: rightImageLeftPadding,
  65. rightPadding: rightImageRightPadding,
  66. topPadding: rightImageTopPadding)
  67. rightViewMode = .always
  68. rightView = sideView
  69. }
  70. func makeSideView(with image: UIImage, leftPadding: CGFloat, rightPadding: CGFloat, topPadding: CGFloat) -> UIView {
  71. let imageView = UIImageView(image: image)
  72. // If not set, use 0 as default value
  73. var leftPaddingValue: CGFloat = 0.0
  74. if !leftPadding.isNaN {
  75. leftPaddingValue = leftPadding
  76. }
  77. // If not set, use 0 as default value
  78. var rightPaddingValue: CGFloat = 0.0
  79. if !rightPadding.isNaN {
  80. rightPaddingValue = rightPadding
  81. }
  82. // If does not specify `topPadding`, then center it in the middle
  83. if topPadding.isNaN {
  84. imageView.frame.origin = CGPoint(x: leftPaddingValue, y: (bounds.height - imageView.bounds.height) / 2)
  85. } else {
  86. imageView.frame.origin = CGPoint(x: leftPaddingValue, y: topPadding)
  87. }
  88. let padding = rightPaddingValue + imageView.bounds.size.width + leftPaddingValue
  89. let sideView = UIView(frame: CGRect(x: 0, y: 0, width: padding, height: bounds.height))
  90. sideView.addSubview(imageView)
  91. return sideView
  92. }
  93. }