ButtonItemView.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // ButtonItemView.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/1/10.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import Combine
  10. class ButtonItemView: UIView {
  11. var itemData: ButtonItemData
  12. var cancellableSet = Set<AnyCancellable>()
  13. lazy var controlButton: UIButton = {
  14. let button = UIButton()
  15. button.backgroundColor = itemData.backgroundColor
  16. if let cornerRadius = itemData.cornerRadius {
  17. button.layer.cornerRadius = cornerRadius
  18. }
  19. return button
  20. }()
  21. lazy var label: UILabel = {
  22. let label = UILabel()
  23. label.textAlignment = isRTL ? .right : .left
  24. label.font = itemData.titleFont ?? UIFont(name: "PingFangSC-Regular", size: 14)
  25. label.textColor = itemData.titleColor ?? UIColor(0xD5E0F2)
  26. label.adjustsFontSizeToFitWidth = true
  27. return label
  28. }()
  29. lazy var imageView: UIImageView = {
  30. let view = UIImageView()
  31. return view
  32. }()
  33. lazy var lineView: UIView = {
  34. let view = UIView()
  35. view.backgroundColor = UIColor(0x4F586B,alpha: 0.1)
  36. view.isHidden = itemData.hasLineView ? false : true
  37. return view
  38. }()
  39. // MARK: - initialized function
  40. init(itemData: ButtonItemData) {
  41. self.itemData = itemData
  42. super.init(frame: .zero)
  43. }
  44. required init?(coder: NSCoder) {
  45. fatalError("init(coder:) has not been implemented")
  46. }
  47. // MARK: - view layout
  48. private var isViewReady: Bool = false
  49. override func didMoveToWindow() {
  50. super.didMoveToWindow()
  51. guard !isViewReady else { return }
  52. constructViewHierarchy()
  53. activateConstraints()
  54. bindInteraction()
  55. isViewReady = true
  56. }
  57. func constructViewHierarchy() {
  58. addSubview(lineView)
  59. addSubview(controlButton)
  60. controlButton.addSubview(imageView)
  61. controlButton.addSubview(label)
  62. }
  63. func activateConstraints() {
  64. controlButton.snp.makeConstraints { make in
  65. make.edges.equalToSuperview()
  66. }
  67. imageView.snp.makeConstraints { make in
  68. if let size = itemData.imageSize {
  69. make.size.equalTo(size)
  70. } else {
  71. make.width.height.equalTo(20)
  72. }
  73. if itemData.orientation == .left {
  74. make.leading.equalToSuperview()
  75. } else {
  76. make.trailing.equalToSuperview()
  77. }
  78. make.centerY.equalToSuperview()
  79. }
  80. label.snp.makeConstraints { make in
  81. make.centerY.equalToSuperview()
  82. if itemData.orientation == .left {
  83. make.leading.equalTo(imageView.snp.trailing).offset(10)
  84. } else {
  85. make.trailing.equalTo(imageView.snp.leading).offset(-10)
  86. }
  87. }
  88. lineView.snp.makeConstraints { make in
  89. make.bottom.equalToSuperview()
  90. make.leading.trailing.equalToSuperview()
  91. make.height.equalTo(1.scale375())
  92. }
  93. }
  94. func bindInteraction() {
  95. setupViewState(item: itemData)
  96. controlButton.addTarget(self, action: #selector(clickMenuButton(sender:)), for: .touchUpInside)
  97. }
  98. func setupViewState(item: ButtonItemData) {
  99. itemData = item
  100. controlButton.isEnabled = item.isEnabled
  101. updateSelectState(item.isSelect)
  102. }
  103. func updateSelectState(_ isSelect: Bool) {
  104. controlButton.isSelected = isSelect
  105. imageView.image = isSelect ? itemData.selectedImage : itemData.normalImage
  106. label.text = isSelect ? itemData.selectedTitle : itemData.normalTitle
  107. }
  108. @objc func clickMenuButton(sender: UIButton) {
  109. itemData.action?(sender)
  110. }
  111. deinit {
  112. debugPrint("deinit \(self)")
  113. }
  114. }