// // RemoveMemberView.swift // QuickLocation // // Created by 八条 on 2026/6/12. // import UIKit import RxSwift import RxCocoa class RemoveMemberView: UIView { var disposeBag = DisposeBag() /// 单行高度 static let rowHeight: CGFloat = 85 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) navBarView.addSubview(deleteBtn) addSubview(titleLab) addSubview(cornerBgView) addSubview(tableView) navBgView.layoutChain .edges(excludingEdge: .bottom) .height(kNaviHeight) navBarView.layoutChain .edges(excludingEdge: .bottom) .height(kNaviHeight) navTitleLabel.layoutChain .top(kStatusBarHeight + 12) .centerX() backBtn.layoutChain .centerY(navTitleLabel) .left(15) .width(24) .height(24) deleteBtn.layoutChain .right(15) .width(100) .height(44) .centerY(navTitleLabel) titleLab.layoutChain .topToBottomOfView(navBarView, offset: 8) .left(15) cornerBgView.layoutChain .topToBottomOfView(titleLab, offset: 16) .edgesHorzontal(15) tableView.layoutChain .topToBottomOfView(titleLab, offset: 16) .edgesHorzontal(15) } /// 根据数据源数量更新高度,上限到 bottom = kSafeBottomMargin + 10 func updateHeight(itemCount: Int) { let contentH = CGFloat(itemCount) * Self.rowHeight let maxH = dl.height - kNaviHeight - kSafeBottomMargin - 10 - 16 let targetH = min(contentH, maxH) tableView.layoutChain.height(targetH) cornerBgView.layoutChain.height(targetH) tableView.isScrollEnabled = targetH > maxH } private var listHeightConstraint: NSLayoutConstraint? 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 }() lazy var deleteBtn: UIButton = { let btn = UIButton(type: .custom) btn.setTitle("删除(0)", for: .normal) btn.setTitleColor(UIColor(hexStr: "#FF383C"), for: .normal) btn.titleLabel?.font = .systemFont(ofSize: 12, weight: .medium) btn.contentHorizontalAlignment = .right return btn }() lazy var titleLab: UILabel = { let label = UILabel() label.text = "圈子成员" label.font = .systemFont(ofSize: 16, weight: .semibold) label.textColor = ThemeManager.shared.color.titleAuxColor return label }() lazy var cornerBgView: UIView = { let view = UIView() view.backgroundColor = UIColor(hexStr: "#F5FBFF") view.cornerRadius = 10 return view }() lazy var tableView: UITableView = { let tableView = UITableView(frame: .zero, style: .plain) tableView.backgroundColor = .clear tableView.separatorStyle = .none tableView.estimatedRowHeight = 85 tableView.isScrollEnabled = false tableView.register(RemoveMemberCell.self) return tableView }() override init(frame: CGRect) { super.init(frame: .zero) backgroundColor = .white setupUI() setupRx() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } // MARK: - RemoveMemberCell class RemoveMemberCell: UITableViewCell { var disposeBag = DisposeBag() func configure(_ model: GroupMemberModel, isOwn: Bool, isSelected: Bool) { avaterImgView.image = model.userIcon nameLab.text = model.nick_name ownView.isHidden = !isOwn selectedBtn.isHidden = isOwn selectedBtn.isSelected = isSelected } 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(avaterImgView) bgView.addSubview(nameLab) bgView.addSubview(stackView) bgView.addSubview(lineView) bgView.layoutChain .edgesHorzontal() .edgesVertical() avaterImgView.layoutChain .edgesVertical(20) .left(15) .height(45) .widthToHeight(1) nameLab.layoutChain .leftToRightOfView(avaterImgView, offset: 10) .centerY(avaterImgView) stackView.layoutChain .right(15) .centerY() ownView.layoutChain.width(25).height(35) selectedBtn.layoutChain.width(20).height(20) lineView.layoutChain .height(0.5) .edgesHorzontal(15) .bottom() } lazy var bgView: UIView = { let view = UIView() view.backgroundColor = .clear//UIColor(hexStr: "#F5FBFF") return view }() lazy var avaterImgView: UIImageView = { let view = UIImageView() view.backgroundColor = .clear view.cornerRadius = 22.5 return view }() lazy var nameLab: UILabel = { let label = UILabel() label.textColor = UIColor(hexStr: "#0F2846") label.font = .systemFont(ofSize: 14, weight: .medium) return label }() lazy var stackView: UIStackView = { let view = UIStackView(arrangedSubviews: [ownView, selectedBtn]) view.axis = .horizontal view.alignment = .trailing view.spacing = 0 view.backgroundColor = .clear return view }() lazy var ownView: UIView = { let view = UIView() view.backgroundColor = .clear view.isHidden = true let icon = UIImageView(image: UIImage(named: "Common/owner")) view.addSubview(icon) icon.layoutChain .top() .centerX() .width(18) .height(18) let label = UILabel() label.text = "圈主" label.textColor = ThemeManager.shared.color.titleAuxColor label.font = .systemFont(ofSize: 10, weight: .medium) view.addSubview(label) label.layoutChain .topToBottomOfView(icon) .centerX() return view }() lazy var selectedBtn: UIButton = { let btn = UIButton(type: .custom) btn.setImage(UIImage(named: "Common/checkbox_20x20"), for: .normal) btn.setImage(UIImage(named: "Common/delete_check"), for: .selected) btn.isUserInteractionEnabled = false btn.isHidden = true return btn }() lazy var lineView: UIView = { let view = UIView() view.backgroundColor = ThemeManager.shared.color.lineColor return view }() 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() } }