// // EmergencyContactAddView.swift // QuickLocation // // Created by 八条 on 2026/6/11. // import UIKit import RxSwift import RxCocoa class EmergencyContactAddView: UIView { var disposeBag = DisposeBag() private func setupRx() { nameTF.rx.text .map { text -> String? in guard let text = text else { return nil } return String(text.prefix(10)) }.bind(to: nameTF.rx.text) .disposed(by: disposeBag) phoneTF.rx.text .map { text -> String? in guard let text = text else { return nil } return String(text.prefix(11)) }.bind(to: phoneTF.rx.text) .disposed(by: disposeBag) let form = Observable.combineLatest(nameTF.rx.text.orEmpty, phoneTF.rx.text.orEmpty) form.map { name, phone -> Bool in if phone.count == 11 && name.count >= 1 { return true } else { return false } } .bind(to: saveBtn.rx.isEnabled) .disposed(by: disposeBag) 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(titleLab) addSubview(infoShadowView) infoShadowView.addSubview(infoView) addSubview(saveBtn) 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) titleLab.layoutChain .topToBottomOfView(navBarView, offset: 20) .left(15) infoShadowView.layoutChain .topToBottomOfView(titleLab, offset: 16) .edgesHorzontal(15) infoView.layoutChain.edges() saveBtn.layoutChain .edgesHorzontal(30) .bottom(kSafeBottomMargin + 30) .height(50) } 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 titleLab: UILabel = { let label = UILabel() label.text = "编辑信息" label.font = .systemFont(ofSize: 14, weight: .medium) label.textColor = ThemeManager.shared.color.titleAuxColor return label }() lazy var infoShadowView: UIView = { let view = UIView() view.backgroundColor = .clear view.layer.shadowColor = UIColor(hexStr: "#0F2846", alpha: 0.1).cgColor view.layer.shadowOffset = CGSize(width: 0, height: 0) view.layer.shadowOpacity = 1 view.layer.shadowRadius = 10 return view }() lazy var infoView: UIView = { let view = UIView() view.backgroundColor = .white view.cornerRadius = 10 view.addSubview(nameInputView) nameInputView.layoutChain .edges(excludingEdge: .bottom) .height(44) view.addSubview(phoneInputView) phoneInputView.layoutChain .topToBottomOfView(nameInputView) .edges(excludingEdge: .top) .height(44) return view }() // 姓名 lazy var nameInputView: UIView = { let view = UIView() view.backgroundColor = .clear let titleLab = UILabel() titleLab.text = "姓名" titleLab.font = .systemFont(ofSize: 14, weight: .medium) titleLab.textColor = UIColor(hexStr: "#1A1A1A") view.addSubview(titleLab) titleLab.layoutChain .left(15) .centerY() view.addSubview(nameTF) nameTF.layoutChain .right(15) .edgesVertical() .width(200) let line = UIView() line.backgroundColor = ThemeManager.shared.color.lineColor view.addSubview(line) line.layoutChain .bottom() .height(0.5) .edgesHorzontal(15) return view }() lazy var nameTF: UITextField = { let textField = UITextField() textField.returnKeyType = .done textField.textAlignment = .right textField.placeholder = "请输入姓名" textField.font = .systemFont(ofSize: 14, weight: .medium) return textField }() // 手机号 lazy var phoneInputView: UIView = { let view = UIView() view.backgroundColor = .clear let titleLab = UILabel() titleLab.text = "手机号" titleLab.font = .systemFont(ofSize: 14, weight: .medium) titleLab.textColor = UIColor(hexStr: "#1A1A1A") view.addSubview(titleLab) titleLab.layoutChain .left(15) .centerY() view.addSubview(phoneTF) phoneTF.layoutChain .right(15) .edgesVertical() .width(150) return view }() lazy var phoneTF: UITextField = { let textField = UITextField() textField.keyboardType = .numberPad textField.returnKeyType = .done textField.textAlignment = .right textField.placeholder = "请输入手机号码" textField.font = .systemFont(ofSize: 14, weight: .medium) return textField }() lazy var saveBtn: UIButton = { let btn = UIButton(type: .custom) btn.setTitle("保存紧急联系人", for: .normal) btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) btn.setTitleColor(.white, for: .normal) btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) btn.cornerRadius = 25 return btn }() override init(frame: CGRect) { super.init(frame: .zero) backgroundColor = UIColor(hexStr: "#FAFAFA") setupUI() setupRx() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }