// // ScheduleViewedView.swift // QuickLocation // // Created by 八条 on 2026/6/26. // import UIKit import RxSwift import RxCocoa import TagListView class ScheduleViewedView: UIView { var disposeBag = DisposeBag() private func setupRx() { backBtn.rx.tap.subscribe(onNext: { _ in AppRouter.shared.popOrDismiss() }).disposed(by: disposeBag) } private func setupUI() { addSubview(navBgView) addSubview(navBarView) navBarView.addSubview(navTitleLabel) navBarView.addSubview(backBtn) addSubview(tableView) navBgView.layoutChain .edges(excludingEdge: .bottom) .heightToWidth(160/375) navBarView.layoutChain .edges(excludingEdge: .bottom) .height(kNaviHeight) navTitleLabel.layoutChain .top(kStatusBarHeight + 12) .centerY(backBtn) .centerX() backBtn.layoutChain .centerY(navTitleLabel) .left(15) .width(24) .height(24) tableView.layoutChain .topToBottomOfView(navBarView, offset: 15) .edges(excludingEdge: .top) } lazy var navBgView: UIImageView = { let iv = UIImageView() iv.image = UIImage(named: "Common/navBar_bg_2") iv.contentMode = .scaleAspectFill return iv }() lazy var navBarView: UIView = { let view = UIView() view.backgroundColor = .clear return view }() lazy var navTitleLabel: UILabel = { let label = UILabel() label.text = "看过我的" label.font = .systemFont(ofSize: 18, weight: .medium) label.textColor = ThemeManager.shared.color.titleAuxColor label.textAlignment = .center return label }() lazy var backBtn: UIButton = { let btn = UIButton(type: .custom) btn.setImage(UIImage(named: "Common/back"), for: .normal) btn.extendEdgeInsets = UIEdgeInsets(top: 54, left: 15, bottom: 100, right: 100) return btn }() override init(frame: CGRect) { super.init(frame: .zero) backgroundColor = .white setupUI() setupRx() } lazy var tableView: UITableView = { let tableView = UITableView(frame: .zero, style: .plain) tableView.backgroundColor = .clear tableView.separatorStyle = .none tableView.estimatedRowHeight = 86 tableView.rowHeight = UITableView.automaticDimension tableView.showsVerticalScrollIndicator = false tableView.register(ScheduleViewedListCell.self) tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSafeBottomMargin + 20, right: 0) return tableView }() required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } // MARK: - ScheduleViewedListCell class ScheduleViewedListCell: UITableViewCell { var disposeBag = DisposeBag() func configure(_ model: ViewedModel) { iconView.image = model.userIcon nameLab.text = model.nick_name viewedCountLab.text = "看过我\(model.count)次" let groupNames = model.groups.map { $0.group_name } // addTags 内部用 frame.width 排标签,先给预估宽度 if !groupNames.isEmpty { let w = contentView.frame.width > 0 ? contentView.frame.width : UIScreen.main.bounds.width tagListView.frame.size.width = w - 185 } tagListView.removeAllTags() tagListView.addTags(groupNames) tagListView.tagViews.forEach { $0.layer.cornerRadius = 2 } tagListView.invalidateIntrinsicContentSize() } override init(style: CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = .clear setupSubviews() } private func setupSubviews() { contentView.addSubview(bgView) bgView.addSubview(cornerView) cornerView.addSubview(iconView) cornerView.addSubview(nameLab) cornerView.addSubview(viewedCountLab) cornerView.addSubview(tagTitleLab) cornerView.addSubview(tagListView) bgView.layoutChain .top(10).bottom() .edgesHorzontal(15) cornerView.layoutChain.edges() iconView.layoutChain .left(15) .top(18) .height(50) .widthToHeight(1) nameLab.layoutChain .topToView(iconView) .leftToRightOfView(iconView, offset: 10) viewedCountLab.layoutChain .right(15) .centerY(nameLab) tagTitleLab.layoutChain .topToBottomOfView(nameLab, offset: 9) .leftToView(nameLab) .width(60) tagListView.layoutChain .topToBottomOfView(nameLab, offset: 5) .leftToRightOfView(tagTitleLab, offset: 5) .bottom(20) .right(15) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } override func prepareForReuse() { super.prepareForReuse() disposeBag = DisposeBag() } lazy var bgView: UIView = { let view = UIView() view.backgroundColor = .clear view.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.05).cgColor view.layer.shadowOffset = CGSize(width: 0, height: 0) view.layer.shadowOpacity = 1 view.layer.shadowRadius = 8 return view }() lazy var cornerView: UIView = { let view = UIView() view.backgroundColor = .white view.cornerRadius = 10 return view }() lazy var iconView: UIImageView = { let view = UIImageView() view.backgroundColor = .clear view.contentMode = .scaleAspectFill view.cornerRadius = 25 return view }() lazy var nameLab: UILabel = { let label = UILabel() label.textColor = ThemeManager.shared.color.titleAuxColor label.font = .systemFont(ofSize: 14, weight: .medium) return label }() lazy var viewedCountLab: UILabel = { let label = UILabel() label.textColor = UIColor(hexStr: "#999999") label.font = .systemFont(ofSize: 12, weight: .medium) return label }() lazy var tagTitleLab: UILabel = { let label = UILabel() label.text = "共同的圈子:" label.textColor = UIColor(hexStr: "#999999") label.font = .systemFont(ofSize: 10, weight: .medium) return label }() lazy var tagListView: TagListView = { let view = TagListView() view.textFont = UIFont.systemFont(ofSize: 8, weight: .regular) view.textColor = UIColor(hexStr: "#B78C56") view.tagBackgroundColor = UIColor(hexStr: "#FFF3E4") view.paddingX = 6 // 水平内边距 view.paddingY = 6 // 垂直内边距 view.alignment = .left // 对齐 view.translatesAutoresizingMaskIntoConstraints = false return view }() }