SAIInputTextFieldItem.swift 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // SAIInputTextFieldItem.swift
  3. // SAIInputBar
  4. //
  5. // Created by SAGESSE on 8/3/16.
  6. // Copyright © 2016-2017 SAGESSE. All rights reserved.
  7. //
  8. import UIKit
  9. internal class SAIInputTextFieldItem: SAIInputItem {
  10. init(textView: UITextView, backgroundView: UIImageView) {
  11. super.init()
  12. _textView = textView
  13. _backgroundView = backgroundView
  14. _backgroundView.image = _SAInputDefaultTextFieldBackgroundImage
  15. }
  16. override var font: UIFont? {
  17. set {
  18. _cacheMinHeight = nil
  19. _textView.font = newValue
  20. }
  21. get {
  22. return _textView.font
  23. }
  24. }
  25. override var tintColor: UIColor? {
  26. set { return _textView.tintColor = newValue }
  27. get { return _textView.tintColor }
  28. }
  29. override var image: UIImage? {
  30. set { return _backgroundView.image = newValue }
  31. get { return _backgroundView.image }
  32. }
  33. var needsUpdateContent: Bool {
  34. let newValue = _textView.contentSize
  35. let oldValue = _cacheContentSize ?? _textView.contentSize
  36. if newValue.width != _textView.frame.width {
  37. return true
  38. }
  39. if newValue.height == oldValue.height {
  40. return false
  41. }
  42. if newValue.height <= _maxHeight {
  43. // 没有超出去
  44. return true
  45. }
  46. if oldValue.height < _maxHeight {
  47. // 虽然己经超出去了, 但还没到最大值呢
  48. return true
  49. }
  50. return false
  51. }
  52. var contentSize: CGSize {
  53. return size
  54. }
  55. override var size: CGSize {
  56. set {
  57. // don't set
  58. }
  59. get {
  60. if let size = _cacheSize {
  61. return size
  62. }
  63. let size = sizeThatFits()
  64. _cacheSize = size
  65. _cacheContentSize = _textView.contentSize
  66. return size
  67. }
  68. }
  69. func contentSizeChanged() {
  70. if needsUpdateContent {
  71. _cacheSize = nil
  72. }
  73. //self.setNeedsLayout()
  74. }
  75. func invalidateCache() {
  76. _cacheSize = nil
  77. _cacheContentSize = nil
  78. }
  79. func sizeThatFits() -> CGSize {
  80. var size = _textView.sizeThatFits(CGSize(width: _textView.bounds.width, height: CGFloat.greatestFiniteMagnitude))
  81. //size.height = min(max(size.height, _minHeight), _maxHeight)
  82. size.height = min(size.height, _maxHeight)
  83. return size
  84. }
  85. var _maxHeight: CGFloat = 106
  86. var _minHeight: CGFloat {
  87. if let height = _cacheMinHeight {
  88. return height
  89. }
  90. if let font = _textView.font {
  91. let edg = _textView.textContainerInset
  92. let mh = font.lineHeight + edg.top + edg.bottom
  93. _cacheMinHeight = mh
  94. return mh
  95. }
  96. return 0
  97. }
  98. var _cacheMinHeight: CGFloat?
  99. var _cacheSize: CGSize?
  100. var _cacheContentSize: CGSize?
  101. weak var _textView: UITextView!
  102. weak var _backgroundView: UIImageView!
  103. }