ListCellItemView.swift 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. //
  2. // ListCellItemView.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/1/6.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. class ListCellItemView: UIView {
  11. let itemData: ListCellItemData
  12. let titleLabel: UILabel = {
  13. let view = UILabel()
  14. view.backgroundColor = .clear
  15. view.textColor = UIColor(0xD1D9EC)
  16. view.font = UIFont.systemFont(ofSize: 14, weight: .regular)
  17. view.minimumScaleFactor = 0.5
  18. return view
  19. }()
  20. let messageLabel: UILabel = {
  21. let view = UILabel()
  22. view.backgroundColor = .clear
  23. view.textColor = UIColor(0xD1D9EC)
  24. view.font = UIFont.systemFont(ofSize: 14, weight: .medium)
  25. view.adjustsFontSizeToFitWidth = false
  26. view.numberOfLines = 0
  27. view.minimumScaleFactor = 0.5
  28. return view
  29. }()
  30. let textField: UITextField = {
  31. let view = UITextField()
  32. view.backgroundColor = .clear
  33. view.textColor = UIColor(0xD1D9EC)
  34. view.font = UIFont(name: "PingFangSC-Regular", size: 14)
  35. let color = UIColor(0xBBBBBB)
  36. view.keyboardType = .numberPad
  37. return view
  38. }()
  39. let rightSwitch: UISwitch = {
  40. let view = UISwitch()
  41. view.isOn = true
  42. view.onTintColor = UIColor(0x0062E3)
  43. return view
  44. }()
  45. lazy var rightButton: UIButton = {
  46. let button = UIButton(type: .custom)
  47. let normalIcon = UIImage(named: "room_drop_down")
  48. button.setImage(normalIcon, for: .normal)
  49. return button
  50. }()
  51. let downLineView : UIView = {
  52. let view = UIView()
  53. view.backgroundColor = UIColor(0x6B758A,alpha: 0.3)
  54. return view
  55. }()
  56. init(itemData: ListCellItemData) {
  57. self.itemData = itemData
  58. super.init(frame: .zero)
  59. }
  60. required init?(coder: NSCoder) {
  61. fatalError("init(coder:) has not been implemented")
  62. }
  63. private var isViewReady: Bool = false
  64. override func didMoveToWindow() {
  65. super.didMoveToWindow()
  66. guard !isViewReady else { return }
  67. constructViewHierarchy()
  68. activateConstraints()
  69. bindInteraction()
  70. isViewReady = true
  71. }
  72. func constructViewHierarchy() {
  73. addSubview(titleLabel)
  74. addSubview(messageLabel)
  75. addSubview(textField)
  76. addSubview(rightSwitch)
  77. addSubview(rightButton)
  78. addSubview(downLineView)
  79. }
  80. func activateConstraints() {
  81. titleLabel.snp.makeConstraints { make in
  82. make.leading.equalToSuperview().offset(20)
  83. make.centerY.equalToSuperview()
  84. make.width.equalTo(100.scale375())
  85. }
  86. messageLabel.snp.makeConstraints { make in
  87. make.left.equalTo(titleLabel.snp.right).offset(10.scale375())
  88. make.trailing.equalToSuperview().offset(-40)
  89. make.centerY.equalToSuperview()
  90. }
  91. textField.snp.makeConstraints { make in
  92. make.left.equalTo(titleLabel.snp.right).offset(10)
  93. make.trailing.equalToSuperview().offset(-100)
  94. make.centerY.equalToSuperview()
  95. }
  96. rightSwitch.snp.makeConstraints { make in
  97. make.trailing.equalToSuperview().offset(-20)
  98. make.centerY.equalToSuperview()
  99. make.width.equalTo(42)
  100. make.height.equalTo(24)
  101. }
  102. rightButton.snp.makeConstraints { make in
  103. make.centerY.equalToSuperview()
  104. make.trailing.equalToSuperview().offset(-20)
  105. }
  106. downLineView.snp.makeConstraints { make in
  107. make.leading.equalToSuperview().offset(20)
  108. make.trailing.equalToSuperview().offset(-20)
  109. make.bottom.equalToSuperview()
  110. make.height.equalTo(1)
  111. }
  112. }
  113. func bindInteraction() {
  114. setupViewState(item: itemData)
  115. if itemData.hasOverAllAction {
  116. let tap = UITapGestureRecognizer(target: self, action: #selector(overAllAction(sender:)))
  117. addGestureRecognizer(tap)
  118. }
  119. rightButton.addTarget(self, action: #selector(rightButtonAction(sender:)), for: .touchUpInside)
  120. rightSwitch.addTarget(self, action: #selector(switchAction(sender:)), for: .touchUpInside)
  121. }
  122. func setupViewState(item: ListCellItemData) {
  123. if item.titleText.isEmpty {
  124. titleLabel.isHidden = true
  125. }
  126. if item.messageText.isEmpty {
  127. messageLabel.isHidden = true
  128. }
  129. if !item.hasFieldView {
  130. textField.isHidden = true
  131. }
  132. if !item.hasSwitch {
  133. rightSwitch.isHidden = true
  134. }
  135. if !item.hasButton {
  136. rightButton.isHidden = true
  137. }
  138. rightSwitch.isOn = item.isSwitchOn
  139. titleLabel.text = item.titleText
  140. messageLabel.text = item.messageText
  141. textField.isUserInteractionEnabled = item.fieldEnable
  142. textField.delegate = self
  143. if item.fieldEnable {
  144. let color = UIColor(0xBBBBBB)
  145. textField.attributedPlaceholder = NSAttributedString(string: item.fieldPlaceholderText,attributes:
  146. [NSAttributedString.Key.foregroundColor:color])
  147. } else {
  148. textField.text = item.fieldText
  149. }
  150. downLineView.isHidden = !item.hasDownLineView
  151. }
  152. @objc func overAllAction(sender: UIView) {
  153. itemData.action?(sender)
  154. }
  155. @objc func rightButtonAction(sender: UIButton) {
  156. itemData.action?(sender)
  157. }
  158. @objc func switchAction(sender: UISwitch) {
  159. itemData.action?(sender)
  160. }
  161. @objc func textFieldAction(sender: UITextField) {
  162. itemData.action?(sender)
  163. }
  164. deinit {
  165. debugPrint("deinit \(self)")
  166. }
  167. }
  168. extension ListCellItemView: UITextFieldDelegate {
  169. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  170. let maxCount = 11
  171. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.05) {
  172. textField.text = textField.text?
  173. .replacingOccurrences(of: " ",
  174. with: "",
  175. options: .literal,
  176. range: nil)
  177. .addIntervalSpace(intervalStr: " ", interval: 3)
  178. }
  179. guard let textFieldText = textField.text,
  180. let rangeOfTextToReplace = Range(range, in: textFieldText) else {
  181. return false
  182. }
  183. let substringToReplace = textFieldText[rangeOfTextToReplace]
  184. if substringToReplace.count > 0 && string.count == 0 {
  185. return true
  186. }
  187. let count = textFieldText.count - substringToReplace.count + string.count
  188. let res = count <= maxCount
  189. return res
  190. }
  191. func textFieldDidChangeSelection(_ textField: UITextField) {
  192. textFieldAction(sender: textField)
  193. }
  194. func textFieldDidEndEditing(_ textField: UITextField) {
  195. textFieldAction(sender: textField)
  196. }
  197. }