// // HomeView.swift // QuickLocation // // Created by 八条 on 2026/5/27. // import UIKit import RxSwift import RxCocoa #if !targetEnvironment(simulator) import MAMapKit #endif class HomeView: UIView { var disposeBag = DisposeBag() // MARK: - Map #if !targetEnvironment(simulator) lazy var mapView: MAMapView = { let mv = MAMapView() mv.zoomLevel = 15 mv.minZoomLevel = 3 mv.maxZoomLevel = 20 mv.showsUserLocation = true mv.userTrackingMode = .follow mv.showsCompass = false mv.showsScale = false mv.isRotateEnabled = false mv.isRotateCameraEnabled = false return mv }() #else lazy var mapPlaceholderView: UIView = { let v = UIView() v.backgroundColor = UIColor(hexStr: "#EDEDED") let label = UILabel() label.text = "Map requires a real device" label.font = UIFont.systemFont(ofSize: 14) label.textColor = UIColor(hexStr: "#999999") label.textAlignment = .center v.addSubview(label) label.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ label.centerXAnchor.constraint(equalTo: v.centerXAnchor), label.centerYAnchor.constraint(equalTo: v.centerYAnchor) ]) return v }() #endif // MARK: - Setup private func setupRx() { } private func setupUI() { #if !targetEnvironment(simulator) addSubview(mapView) #else addSubview(mapPlaceholderView) #endif addSubview(navBarBg) addSubview(avatarImgView) addSubview(groupView) groupView.addSubview(groupIconView) groupView.addSubview(groupNameLab) groupView.addSubview(groupArrowIconView) addSubview(toolsView) addSubview(locationView) locationView.addSubview(locationIconView) #if !targetEnvironment(simulator) mapView.layoutChain .top() .edges(excludingEdge: .top) sendSubviewToBack(mapView) #else mapPlaceholderView.layoutChain .topToBottomOfView(navBarBg) .left(0).right(0).bottom(0) #endif navBarBg.layoutChain .edges(excludingEdge: .bottom) .heightToWidth(160/375) avatarImgView.layoutChain .top(59) .left(15) .width(36) .heightToWidth(1) groupView.layoutChain .centerY(avatarImgView) .height(36) .centerX() .width(185, relation: .greaterThanOrEqual) groupIconView.layoutChain .left(11) .centerY() .width(30) .height(30) groupArrowIconView.layoutChain .right(15) .centerY() .width(15) .height(8.5) groupNameLab.layoutChain .edgesVertical() .leftToRightOfView(groupIconView) .rightToLeftOfView(groupArrowIconView) toolsView.layoutChain .left(23) .centerY() .width(40) bubbleView.layoutChain .top(12) .height(58) bubbleIcon.layoutChain .top() .centerX() .width(28) .height(28) bubbleLab.layoutChain .topToBottomOfView(bubbleIcon, offset: 4) .edgesHorzontal() signInView.layoutChain.height(58) signInIcon.layoutChain .top() .centerX() .width(28) .height(28) signInLab.layoutChain .topToBottomOfView(signInIcon, offset: 4) .edgesHorzontal() sosView.layoutChain .height(56) sosIcon.layoutChain .top() .centerX() .width(28) .height(28) sosLab.layoutChain .topToBottomOfView(sosIcon, offset: 4) .edgesHorzontal() locationView.layoutChain .right(15) .bottomToView(toolsView) .width(40) .height(40) locationIconView.layoutChain .centerX() .centerY() } 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: - UI Components lazy var navBarBg: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Home/navBar_bg") view.contentMode = .scaleAspectFill return view }() lazy var avatarImgView: UIImageView = { let view = UIImageView() view.image = UIImage(named: "map_avatar_1") view.backgroundColor = .clear view.contentMode = .scaleAspectFill view.cornerRadius = 18 return view }() lazy var groupView: UIView = { let view = UIView() view.backgroundColor = .white view.cornerRadius = 18 return view }() lazy var groupIconView: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Home/group") view.backgroundColor = .clear view.contentMode = .scaleAspectFill return view }() lazy var groupNameLab: UILabel = { let label = UILabel() label.text = "我的圈子" label.font = .systemFont(ofSize: 16, weight: .medium) label.textColor = UIColor(hexStr: "#0F2846") label.textAlignment = .center return label }() lazy var groupArrowIconView: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Home/arrow_down") view.backgroundColor = .clear view.contentMode = .scaleAspectFill return view }() // MARK: - 侧边工具栏 lazy var toolsView: UIStackView = { let view = UIStackView(arrangedSubviews: [bubbleView, signInView, sosView]) view.axis = .vertical view.alignment = .center view.spacing = 0 view.backgroundColor = .black.withAlphaComponent(0.5) view.cornerRadius = 20 return view }() // 气泡 lazy var bubbleView: UIView = { let view = UIView() view.backgroundColor = .clear view.addSubview(bubbleIcon) view.addSubview(bubbleLab) let lineView = UIView() lineView.backgroundColor = .white view.addSubview(lineView) lineView.layoutChain .width(12) .height(2) .centerX() .bottom(7) return view }() lazy var bubbleIcon: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Home/bubble") view.backgroundColor = .clear view.contentMode = .scaleAspectFill return view }() lazy var bubbleLab: UILabel = { let label = UILabel() label.text = "气泡" label.font = .systemFont(ofSize: 10, weight: .medium) label.textColor = .white label.textAlignment = .center return label }() // 签到 lazy var signInView: UIView = { let view = UIView() view.backgroundColor = .clear view.addSubview(signInIcon) view.addSubview(signInLab) let lineView = UIView() lineView.backgroundColor = .white view.addSubview(lineView) lineView.layoutChain .width(12) .height(2) .centerX() .bottom(7) return view }() lazy var signInIcon: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Home/signIn") view.backgroundColor = .clear view.contentMode = .scaleAspectFill return view }() lazy var signInLab: UILabel = { let label = UILabel() label.text = "签到" label.font = .systemFont(ofSize: 10, weight: .medium) label.textColor = .white label.textAlignment = .center return label }() // SOS lazy var sosView: UIView = { let view = UIView() view.backgroundColor = .clear view.addSubview(sosIcon) view.addSubview(sosLab) return view }() lazy var sosIcon: UIImageView = { let view = UIImageView() view.image = UIImage(named: "Home/sos") view.backgroundColor = .clear view.contentMode = .scaleAspectFill return view }() lazy var sosLab: UILabel = { let label = UILabel() label.text = "SOS" label.font = .systemFont(ofSize: 10, weight: .medium) label.textColor = .white label.textAlignment = .center return label }() // MARK: - 定位按钮 lazy var locationView: UIView = { let view = UIView() view.backgroundColor = .black.withAlphaComponent(0.4) view.cornerRadius = 20 return view }() lazy var locationIconView: UIImageView = { let view = UIImageView() view.backgroundColor = .clear view.image = UIImage(named: "Home/location") return view }() }