| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- //
- // ChannelSelectPopView.swift
- // RoderickRalph
- //
- // Created by Neoa on 2025/9/2.
- //
- import Foundation
- import UIKit
- // MARK: - Channel Models & Popup
- struct Channel: Codable, Hashable {
- let id: String
- let name: String
- }
- protocol ChannelSelectPopupViewDelegate: AnyObject {
- func channelSelectPopupView(_ view: ChannelSelectPopupView, didSelect channel: Channel)
- }
- class ChannelSelectPopupView: UIView {
- weak var delegate: ChannelSelectPopupViewDelegate?
- private let channels: [Channel]
- private let backgroundView: UIView = {
- let v = UIView()
- v.backgroundColor = UIColor.black.withAlphaComponent(0.5)
- v.translatesAutoresizingMaskIntoConstraints = false
- return v
- }()
- private let popupBackgroundImageView: UIImageView = {
- let imageView = UIImageView()
- imageView.image = UIImage(named: "pqan335")
- imageView.contentMode = .scaleToFill
- imageView.translatesAutoresizingMaskIntoConstraints = false
- return imageView
- }()
- private let titleButton: UIButton = {
- let button = UIButton(type: .system)
- button.setBackgroundImage(UIImage(named: "pqan333"), for: .normal)
- button.setTitle("请选择渠道", for: .normal)
- button.setTitleColor(.white, for: .normal)
- button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
- button.translatesAutoresizingMaskIntoConstraints = false
- button.isUserInteractionEnabled = false
- return button
- }()
- private let scrollView: UIScrollView = {
- let sv = UIScrollView()
- sv.translatesAutoresizingMaskIntoConstraints = false
- return sv
- }()
- private let stackView: UIStackView = {
- let sv = UIStackView()
- sv.axis = .vertical
- sv.spacing = 10
- sv.alignment = .fill
- sv.distribution = .fill
- sv.translatesAutoresizingMaskIntoConstraints = false
- return sv
- }()
- private let closeButton: UIButton = {
- let button = UIButton(type: .custom)
- button.setImage(UIImage(named: "pqan334"), for: .normal)
- button.translatesAutoresizingMaskIntoConstraints = false
- return button
- }()
- init(channels: [Channel]) {
- self.channels = channels
- super.init(frame: .zero)
- setupUI()
- setupConstraints()
- populateChannels()
- }
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- private func setupUI() {
- addSubview(backgroundView)
- addSubview(popupBackgroundImageView)
- addSubview(titleButton)
- addSubview(scrollView)
- scrollView.addSubview(stackView)
- addSubview(closeButton)
- closeButton.isHidden = true
-
- closeButton.addTarget(self, action: #selector(closePopup), for: .touchUpInside)
- // Tap to dismiss on the dim background
- let tapGesture = UITapGestureRecognizer(target: self, action: #selector(closePopup))
- backgroundView.addGestureRecognizer(tapGesture)
- }
- private func setupConstraints() {
- NSLayoutConstraint.activate([
- backgroundView.topAnchor.constraint(equalTo: topAnchor),
- backgroundView.bottomAnchor.constraint(equalTo: bottomAnchor),
- backgroundView.leadingAnchor.constraint(equalTo: leadingAnchor),
- backgroundView.trailingAnchor.constraint(equalTo: trailingAnchor),
- popupBackgroundImageView.centerXAnchor.constraint(equalTo: centerXAnchor),
- popupBackgroundImageView.centerYAnchor.constraint(equalTo: centerYAnchor),
- popupBackgroundImageView.widthAnchor.constraint(equalToConstant: 333),
- popupBackgroundImageView.heightAnchor.constraint(equalToConstant: 333),
- titleButton.topAnchor.constraint(equalTo: popupBackgroundImageView.topAnchor, constant: 10),
- titleButton.centerXAnchor.constraint(equalTo: popupBackgroundImageView.centerXAnchor),
- titleButton.widthAnchor.constraint(equalToConstant: 132),
- titleButton.heightAnchor.constraint(equalToConstant: 37),
- scrollView.topAnchor.constraint(equalTo: titleButton.bottomAnchor, constant: 12),
- scrollView.leadingAnchor.constraint(equalTo: popupBackgroundImageView.leadingAnchor, constant: 20),
- scrollView.trailingAnchor.constraint(equalTo: popupBackgroundImageView.trailingAnchor, constant: -20),
- scrollView.bottomAnchor.constraint(equalTo: popupBackgroundImageView.bottomAnchor, constant: -20),
- stackView.topAnchor.constraint(equalTo: scrollView.topAnchor),
- stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
- stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
- stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
- stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor),
- closeButton.topAnchor.constraint(equalTo: popupBackgroundImageView.topAnchor, constant: -12),
- closeButton.trailingAnchor.constraint(equalTo: popupBackgroundImageView.trailingAnchor, constant: 12),
- closeButton.widthAnchor.constraint(equalToConstant: 24),
- closeButton.heightAnchor.constraint(equalToConstant: 24)
- ])
- }
- private func makeChannelButton(title: String) -> UIButton {
- let button = UIButton(type: .system)
- button.setBackgroundImage(UIImage(named: "tqan323"), for: .normal)
- button.setTitle(title, for: .normal)
- button.setTitleColor(.white, for: .normal)
- button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
- button.contentHorizontalAlignment = .center
- button.heightAnchor.constraint(equalToConstant: 45).isActive = true
- return button
- }
- private func populateChannels() {
- for (idx, channel) in channels.enumerated() {
- let button = makeChannelButton(title: channel.name)
- button.tag = idx
- button.addTarget(self, action: #selector(channelButtonTapped(_:)), for: .touchUpInside)
- stackView.addArrangedSubview(button)
- }
- }
- @objc private func channelButtonTapped(_ sender: UIButton) {
- let idx = sender.tag
- guard idx >= 0 && idx < channels.count else { return }
- let channel = channels[idx]
- delegate?.channelSelectPopupView(self, didSelect: channel)
- }
- @objc private func closePopup() {
- // removeFromSuperview()
- }
- }
|