// // CreateBubbleDoneView.swift // QuickLocation // // Created by 八条 on 2026/6/26. // import UIKit import RxSwift import RxCocoa class CreateBubbleDoneView: UIView { var disposeBag = DisposeBag() private func setupRx() { } private func setupUI() { addSubview(titleLab) addSubview(timeIcon) addSubview(timeLab) addSubview(messageView) addSubview(iconView) addSubview(popupBtn) titleLab.layoutChain .top(15) .centerX() timeLab.layoutChain .topToBottomOfView(titleLab, offset: 12) .centerX() timeIcon.layoutChain .rightToLeftOfView(timeLab, offset: -8) .centerY(timeLab) messageView.layoutChain .topToBottomOfView(timeLab, offset: 41) .left(79) .right(30) iconView.layoutChain .rightToLeftOfView(messageView, offset: -9) .bottomToView(messageView) .height(40) .width(40) popupBtn.layoutChain .width(240) .height(50) .centerX() .bottom(kSafeBottomMargin + 20) } lazy var titleLab: UILabel = { let label = UILabel() label.text = "您的泡将在以下时间弹出:" label.font = .systemFont(ofSize: 16, weight: .medium) label.textColor = ThemeManager.shared.color.titleAuxColor label.numberOfLines = 0 return label }() lazy var popupBtn: UIButton = { let btn = UIButton(type: .custom) btn.setTitle("弹出气泡", for: .normal) btn.setTitleColor(.white, for: .normal) btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) btn.cornerRadius = 25 return btn }() lazy var timeIcon: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Bubble/time") return view }() lazy var timeLab: UILabel = { let label = UILabel() label.font = .systemFont(ofSize: 20, weight: .bold) label.textColor = ThemeManager.shared.color.titleAuxColor return label }() lazy var iconView: UIImageView = { let view = UIImageView(image: UIImage(named: "UserIcon/7")) view.cornerRadius = 20 return view }() lazy var messageView: UIView = { let view = UIView() view.backgroundColor = UIColor(hexStr: "#EBF6F9") view.cornerRadius = 10 view.addSubview(messageLab) messageLab.layoutChain .edgesHorzontal(18) .edgesVertical(15) return view }() lazy var messageLab: UILabel = { let label = UILabel() label.font = .systemFont(ofSize: 16, weight: .medium) label.textColor = ThemeManager.shared.color.titleAuxColor label.numberOfLines = 0 return label }() private var countdownTimer: Timer? private var endDate: Date = Date() func startCountdown(endDate: Date) { self.endDate = endDate countdownTimer?.invalidate() countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in self?.updateTime() } updateTime() } private func updateTime() { let remaining = endDate.timeIntervalSince(Date()) if remaining <= 0 { timeLab.text = "00:00:00" countdownTimer?.invalidate() countdownTimer = nil return } let hours = Int(remaining) / 3600 let minutes = (Int(remaining) % 3600) / 60 let seconds = Int(remaining) % 60 timeLab.text = String(format: "%02d:%02d:%02d", hours, minutes, seconds) } deinit { countdownTimer?.invalidate() } override init(frame: CGRect) { super.init(frame: .zero) self.isHidden = true backgroundColor = .white setupUI() setupRx() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }