ListCellItemView.swift 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. class ListCellItemView: UIView {
  10. let itemData: ListCellItemData
  11. let titleLabel: UILabel = {
  12. let view = UILabel()
  13. view.backgroundColor = .clear
  14. view.textColor = UIColor(0x8F9AB2)
  15. view.font = UIFont(name: "PingFangSC-Medium", size: 14)
  16. view.minimumScaleFactor = 0.5
  17. return view
  18. }()
  19. let messageLabel: UILabel = {
  20. let view = UILabel()
  21. view.backgroundColor = .clear
  22. view.textColor = UIColor(0xD5E0F2)
  23. view.font = UIFont(name: "PingFangSC-Medium", size: 14)
  24. view.adjustsFontSizeToFitWidth = false
  25. view.minimumScaleFactor = 0.5
  26. return view
  27. }()
  28. let slider: UISlider = {
  29. let view = UISlider()
  30. return view
  31. }()
  32. let sliderLabel: UILabel = {
  33. let view = UILabel()
  34. view.textAlignment = isRTL ? .left : .right
  35. view.backgroundColor = .clear
  36. view.textColor = UIColor(0xD1D9EC)
  37. view.font = UIFont(name: "PingFangSC-Medium", size: 14)
  38. view.adjustsFontSizeToFitWidth = true
  39. view.textAlignment = .center
  40. return view
  41. }()
  42. let rightSwitch: UISwitch = {
  43. let view = UISwitch()
  44. view.isOn = true
  45. view.onTintColor = UIColor(0x0062E3)
  46. return view
  47. }()
  48. lazy var rightButton: ButtonItemView = {
  49. let button = ButtonItemView(itemData: itemData.buttonData ?? ButtonItemData())
  50. return button
  51. }()
  52. let downLineView : UIView = {
  53. let view = UIView()
  54. view.backgroundColor = UIColor(0x6B758A,alpha: 0.3)
  55. return view
  56. }()
  57. init(itemData: ListCellItemData) {
  58. self.itemData = itemData
  59. super.init(frame: .zero)
  60. }
  61. required init?(coder: NSCoder) {
  62. fatalError("init(coder:) has not been implemented")
  63. }
  64. private var isViewReady: Bool = false
  65. override func didMoveToWindow() {
  66. super.didMoveToWindow()
  67. guard !isViewReady else { return }
  68. constructViewHierarchy()
  69. activateConstraints()
  70. bindInteraction()
  71. isViewReady = true
  72. }
  73. func constructViewHierarchy() {
  74. addSubview(titleLabel)
  75. addSubview(messageLabel)
  76. addSubview(slider)
  77. addSubview(sliderLabel)
  78. addSubview(rightSwitch)
  79. addSubview(rightButton)
  80. addSubview(downLineView)
  81. }
  82. func activateConstraints() {
  83. titleLabel.snp.makeConstraints { make in
  84. make.leading.equalToSuperview()
  85. make.centerY.equalToSuperview()
  86. make.width.equalTo(100.scale375())
  87. make.height.equalTo(20.scale375())
  88. }
  89. messageLabel.snp.makeConstraints { make in
  90. make.leading.equalTo(titleLabel.snp.trailing).offset(16.scale375())
  91. make.centerY.equalToSuperview()
  92. if itemData.hasRightButton {
  93. make.trailing.equalTo(rightButton.snp.leading)
  94. } else if (itemData.hasSwitch) {
  95. make.trailing.equalTo(rightSwitch.snp.leading)
  96. } else {
  97. make.trailing.equalToSuperview()
  98. }
  99. make.height.equalTo(20.scale375())
  100. }
  101. slider.snp.makeConstraints { make in
  102. make.trailing.equalToSuperview()
  103. make.width.equalTo(152.scale375())
  104. make.centerY.equalToSuperview()
  105. }
  106. sliderLabel.snp.makeConstraints { make in
  107. make.leading.equalTo(titleLabel.snp.trailing).offset(5.scale375())
  108. make.trailing.equalTo(slider.snp.leading).offset(-5.scale375())
  109. make.centerY.equalToSuperview()
  110. }
  111. rightSwitch.snp.makeConstraints { make in
  112. make.trailing.equalToSuperview()
  113. make.centerY.equalToSuperview()
  114. }
  115. rightButton.snp.makeConstraints { make in
  116. make.centerY.equalToSuperview()
  117. make.trailing.equalToSuperview()
  118. if let size = itemData.buttonData?.size {
  119. make.width.equalTo(size.width)
  120. make.height.equalTo(size.height)
  121. } else {
  122. make.width.equalTo(57.scale375())
  123. make.height.equalTo(20.scale375Height())
  124. }
  125. }
  126. downLineView.snp.makeConstraints { make in
  127. make.leading.equalToSuperview()
  128. make.trailing.equalToSuperview()
  129. make.bottom.equalToSuperview()
  130. make.height.equalTo(0.5)
  131. }
  132. }
  133. func bindInteraction() {
  134. setupViewState(item: itemData)
  135. if itemData.hasOverAllAction {
  136. let tap = UITapGestureRecognizer(target: self, action: #selector(overAllAction(sender:)))
  137. addGestureRecognizer(tap)
  138. }
  139. rightSwitch.addTarget(self, action: #selector(switchAction(sender:)), for: .touchUpInside)
  140. slider.addTarget(self, action: #selector(sliderAction(sender:)), for: .valueChanged)
  141. }
  142. func setupViewState(item: ListCellItemData) {
  143. titleLabel.isHidden = item.titleText.isEmpty
  144. titleLabel.text = item.titleText
  145. if let titleColor = item.titleColor {
  146. titleLabel.textColor = titleColor
  147. }
  148. messageLabel.isHidden = item.messageText.isEmpty
  149. messageLabel.text = item.messageText
  150. if let messageColor = item.messageColor {
  151. messageLabel.textColor = messageColor
  152. }
  153. rightSwitch.isHidden = !item.hasSwitch
  154. rightSwitch.isOn = item.isSwitchOn
  155. rightButton.isHidden = !item.hasRightButton
  156. if let buttonData = item.buttonData {
  157. rightButton.setupViewState(item: buttonData)
  158. }
  159. slider.isHidden = !item.hasSlider
  160. sliderLabel.isHidden = !item.hasSliderLabel
  161. slider.minimumValue = item.minimumValue / item.sliderStep
  162. slider.maximumValue = item.maximumValue / item.sliderStep
  163. slider.value = item.sliderDefault / item.sliderStep
  164. sliderLabel.text = String(Int(slider.value) * Int(item.sliderStep)) + item.sliderUnit
  165. downLineView.isHidden = !itemData.hasDownLineView
  166. }
  167. @objc func overAllAction(sender: UIView) {
  168. itemData.action?(sender)
  169. }
  170. @objc func rightButtonAction(sender: UIButton) {
  171. itemData.action?(sender)
  172. }
  173. @objc func switchAction(sender: UISwitch) {
  174. itemData.action?(sender)
  175. }
  176. @objc func textFieldAction(sender: UITextField) {
  177. itemData.action?(sender)
  178. }
  179. @objc func sliderAction(sender: UISlider) {
  180. sliderLabel.text = String(Int(slider.value) * Int(itemData.sliderStep)) + itemData.sliderUnit
  181. itemData.action?(sender)
  182. }
  183. deinit {
  184. debugPrint("deinit \(self)")
  185. }
  186. }