ChannelSelectPopView.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //
  2. // ChannelSelectPopView.swift
  3. // RoderickRalph
  4. //
  5. // Created by Neoa on 2025/9/2.
  6. //
  7. import Foundation
  8. import UIKit
  9. // MARK: - Channel Models & Popup
  10. struct Channel: Codable, Hashable {
  11. let id: String
  12. let name: String
  13. }
  14. protocol ChannelSelectPopupViewDelegate: AnyObject {
  15. func channelSelectPopupView(_ view: ChannelSelectPopupView, didSelect channel: Channel)
  16. }
  17. class ChannelSelectPopupView: UIView {
  18. weak var delegate: ChannelSelectPopupViewDelegate?
  19. private let channels: [Channel]
  20. private let backgroundView: UIView = {
  21. let v = UIView()
  22. v.backgroundColor = UIColor.black.withAlphaComponent(0.5)
  23. v.translatesAutoresizingMaskIntoConstraints = false
  24. return v
  25. }()
  26. private let popupBackgroundImageView: UIImageView = {
  27. let imageView = UIImageView()
  28. imageView.image = UIImage(named: "pqan335")
  29. imageView.contentMode = .scaleToFill
  30. imageView.translatesAutoresizingMaskIntoConstraints = false
  31. return imageView
  32. }()
  33. private let titleButton: UIButton = {
  34. let button = UIButton(type: .system)
  35. button.setBackgroundImage(UIImage(named: "pqan333"), for: .normal)
  36. button.setTitle("请选择渠道", for: .normal)
  37. button.setTitleColor(.white, for: .normal)
  38. button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
  39. button.translatesAutoresizingMaskIntoConstraints = false
  40. button.isUserInteractionEnabled = false
  41. return button
  42. }()
  43. private let scrollView: UIScrollView = {
  44. let sv = UIScrollView()
  45. sv.translatesAutoresizingMaskIntoConstraints = false
  46. return sv
  47. }()
  48. private let stackView: UIStackView = {
  49. let sv = UIStackView()
  50. sv.axis = .vertical
  51. sv.spacing = 10
  52. sv.alignment = .fill
  53. sv.distribution = .fill
  54. sv.translatesAutoresizingMaskIntoConstraints = false
  55. return sv
  56. }()
  57. private let closeButton: UIButton = {
  58. let button = UIButton(type: .custom)
  59. button.setImage(UIImage(named: "pqan334"), for: .normal)
  60. button.translatesAutoresizingMaskIntoConstraints = false
  61. return button
  62. }()
  63. init(channels: [Channel]) {
  64. self.channels = channels
  65. super.init(frame: .zero)
  66. setupUI()
  67. setupConstraints()
  68. populateChannels()
  69. }
  70. required init?(coder: NSCoder) {
  71. fatalError("init(coder:) has not been implemented")
  72. }
  73. private func setupUI() {
  74. addSubview(backgroundView)
  75. addSubview(popupBackgroundImageView)
  76. addSubview(titleButton)
  77. addSubview(scrollView)
  78. scrollView.addSubview(stackView)
  79. addSubview(closeButton)
  80. closeButton.isHidden = true
  81. closeButton.addTarget(self, action: #selector(closePopup), for: .touchUpInside)
  82. // Tap to dismiss on the dim background
  83. let tapGesture = UITapGestureRecognizer(target: self, action: #selector(closePopup))
  84. backgroundView.addGestureRecognizer(tapGesture)
  85. }
  86. private func setupConstraints() {
  87. NSLayoutConstraint.activate([
  88. backgroundView.topAnchor.constraint(equalTo: topAnchor),
  89. backgroundView.bottomAnchor.constraint(equalTo: bottomAnchor),
  90. backgroundView.leadingAnchor.constraint(equalTo: leadingAnchor),
  91. backgroundView.trailingAnchor.constraint(equalTo: trailingAnchor),
  92. popupBackgroundImageView.centerXAnchor.constraint(equalTo: centerXAnchor),
  93. popupBackgroundImageView.centerYAnchor.constraint(equalTo: centerYAnchor),
  94. popupBackgroundImageView.widthAnchor.constraint(equalToConstant: 333),
  95. popupBackgroundImageView.heightAnchor.constraint(equalToConstant: 333),
  96. titleButton.topAnchor.constraint(equalTo: popupBackgroundImageView.topAnchor, constant: 10),
  97. titleButton.centerXAnchor.constraint(equalTo: popupBackgroundImageView.centerXAnchor),
  98. titleButton.widthAnchor.constraint(equalToConstant: 132),
  99. titleButton.heightAnchor.constraint(equalToConstant: 37),
  100. scrollView.topAnchor.constraint(equalTo: titleButton.bottomAnchor, constant: 12),
  101. scrollView.leadingAnchor.constraint(equalTo: popupBackgroundImageView.leadingAnchor, constant: 20),
  102. scrollView.trailingAnchor.constraint(equalTo: popupBackgroundImageView.trailingAnchor, constant: -20),
  103. scrollView.bottomAnchor.constraint(equalTo: popupBackgroundImageView.bottomAnchor, constant: -20),
  104. stackView.topAnchor.constraint(equalTo: scrollView.topAnchor),
  105. stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
  106. stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
  107. stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
  108. stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor),
  109. closeButton.topAnchor.constraint(equalTo: popupBackgroundImageView.topAnchor, constant: -12),
  110. closeButton.trailingAnchor.constraint(equalTo: popupBackgroundImageView.trailingAnchor, constant: 12),
  111. closeButton.widthAnchor.constraint(equalToConstant: 24),
  112. closeButton.heightAnchor.constraint(equalToConstant: 24)
  113. ])
  114. }
  115. private func makeChannelButton(title: String) -> UIButton {
  116. let button = UIButton(type: .system)
  117. button.setBackgroundImage(UIImage(named: "tqan323"), for: .normal)
  118. button.setTitle(title, for: .normal)
  119. button.setTitleColor(.white, for: .normal)
  120. button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
  121. button.contentHorizontalAlignment = .center
  122. button.heightAnchor.constraint(equalToConstant: 45).isActive = true
  123. return button
  124. }
  125. private func populateChannels() {
  126. for (idx, channel) in channels.enumerated() {
  127. let button = makeChannelButton(title: channel.name)
  128. button.tag = idx
  129. button.addTarget(self, action: #selector(channelButtonTapped(_:)), for: .touchUpInside)
  130. stackView.addArrangedSubview(button)
  131. }
  132. }
  133. @objc private func channelButtonTapped(_ sender: UIButton) {
  134. let idx = sender.tag
  135. guard idx >= 0 && idx < channels.count else { return }
  136. let channel = channels[idx]
  137. delegate?.channelSelectPopupView(self, didSelect: channel)
  138. }
  139. @objc private func closePopup() {
  140. // removeFromSuperview()
  141. }
  142. }