415 lines
13 KiB
Swift
415 lines
13 KiB
Swift
//
|
||
// SearchLocationResultView.swift
|
||
// QuickLocation
|
||
//
|
||
// Created by 八条 on 2026/6/27.
|
||
//
|
||
|
||
import UIKit
|
||
import RxSwift
|
||
import RxCocoa
|
||
import Lottie
|
||
|
||
class SearchLocationResultView: UIView {
|
||
|
||
var disposeBag = DisposeBag()
|
||
|
||
private func setupRx() {
|
||
backBtn.rx.tap.subscribe(onNext: { _ in
|
||
AppRouter.shared.popOrDismiss()
|
||
}).disposed(by: disposeBag)
|
||
}
|
||
|
||
private func setupUI() {
|
||
addSubview(unlockVipView)
|
||
addSubview(navBgView)
|
||
addSubview(navBarView)
|
||
navBarView.addSubview(navTitleLabel)
|
||
navBarView.addSubview(backBtn)
|
||
|
||
addSubview(normalView)
|
||
addSubview(successLottieView)
|
||
|
||
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)
|
||
|
||
unlockVipView.layoutChain.edges()
|
||
|
||
successLottieView.layoutChain.edges()
|
||
|
||
normalView.layoutChain
|
||
.topToBottomOfView(navBarView)
|
||
.edges(excludingEdge: .top)
|
||
}
|
||
|
||
// MARK: - Views
|
||
|
||
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
|
||
}()
|
||
|
||
// MARK: - 成功烟花Lottie
|
||
lazy var successLottieView: LottieAnimationView = {
|
||
let view = LottieAnimationView(name: "phone_search_fireworks")
|
||
view.loopMode = .loop
|
||
view.isUserInteractionEnabled = false
|
||
return view
|
||
}()
|
||
|
||
// MARK: - 已解锁vip
|
||
lazy var normalView: UIView = {
|
||
let view = UIView()
|
||
view.backgroundColor = .clear
|
||
|
||
view.addSubview(normalLottieView)
|
||
normalLottieView.layoutChain
|
||
.top(20)
|
||
.width(270)
|
||
.heightToWidth(1)
|
||
.centerX()
|
||
|
||
view.addSubview(phoneAreaLab)
|
||
phoneAreaLab.layoutChain
|
||
.topToBottomOfView(normalLottieView)
|
||
.centerX()
|
||
|
||
view.addSubview(messageLab)
|
||
messageLab.layoutChain
|
||
.topToBottomOfView(phoneAreaLab, offset: 10)
|
||
.centerX()
|
||
|
||
view.addSubview(tipsLab)
|
||
tipsLab.layoutChain
|
||
.topToBottomOfView(messageLab, offset: 15)
|
||
.edgesHorzontal(31)
|
||
|
||
view.addSubview(inviteBtn)
|
||
inviteBtn.layoutChain
|
||
.topToBottomOfView(tipsLab, offset: 30)
|
||
.edgesHorzontal(68)
|
||
.height(50)
|
||
|
||
view.addSubview(inviteView)
|
||
inviteView.layoutChain
|
||
.topToBottomOfView(tipsLab, offset: 25)
|
||
.edgesHorzontal(15)
|
||
.height(80)
|
||
|
||
return view
|
||
}()
|
||
|
||
lazy var phoneAreaLab: UILabel = {
|
||
let label = UILabel()
|
||
label.text = " "
|
||
label.font = .systemFont(ofSize: 20, weight: .semibold)
|
||
label.textColor = UIColor(hexStr: "#16B3FF")
|
||
return label
|
||
}()
|
||
|
||
lazy var messageLab: UILabel = {
|
||
let label = UILabel()
|
||
label.font = .systemFont(ofSize: 16, weight: .bold)
|
||
label.textColor = UIColor(hexStr: "#333333")
|
||
return label
|
||
}()
|
||
|
||
lazy var tipsLab: UILabel = {
|
||
let label = UILabel()
|
||
label.font = .systemFont(ofSize: 12, weight: .medium)
|
||
label.textColor = UIColor(hexStr: "#999999")
|
||
label.numberOfLines = 0
|
||
return label
|
||
}()
|
||
|
||
lazy var normalLottieView: LottieAnimationView = {
|
||
let view = LottieAnimationView()
|
||
view.loopMode = .loop
|
||
return view
|
||
}()
|
||
|
||
lazy var inviteBtn: UIButton = {
|
||
let btn = UIButton(type: .custom)
|
||
btn.setTitle("邀请Ta加入", 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
|
||
btn.isHidden = true
|
||
return btn
|
||
}()
|
||
|
||
lazy var inviteView: UIView = {
|
||
let view = UIView()
|
||
view.backgroundColor = UIColor(hexStr: "#EFF9FF")
|
||
view.cornerRadius = 16
|
||
view.isHidden = true
|
||
|
||
view.addSubview(successBtn)
|
||
successBtn.layoutChain
|
||
.right(15)
|
||
.centerY()
|
||
.width(90)
|
||
.height(36)
|
||
|
||
view.addSubview(successTipsLab)
|
||
successTipsLab.layoutChain
|
||
.topToCenterYOfView(view)
|
||
.left(15)
|
||
|
||
view.addSubview(phoneLab)
|
||
phoneLab.layoutChain
|
||
.bottomToCenterYOfView(view)
|
||
.left(15)
|
||
|
||
return view
|
||
}()
|
||
|
||
lazy var phoneLab: UILabel = {
|
||
let label = UILabel()
|
||
label.font = .systemFont(ofSize: 16, weight: .bold)
|
||
label.textColor = UIColor(hexStr: "#333333")
|
||
return label
|
||
}()
|
||
|
||
lazy var successTipsLab: UILabel = {
|
||
let label = UILabel()
|
||
label.text = "邀请加入圈子后分享位置"
|
||
label.font = .systemFont(ofSize: 10, weight: .medium)
|
||
label.textColor = UIColor(hexStr: "#999999")
|
||
return label
|
||
}()
|
||
|
||
lazy var successBtn: UIButton = {
|
||
let btn = UIButton(type: .custom)
|
||
btn.setTitle("邀请Ta", for: .normal)
|
||
btn.setTitleColor(.white, for: .normal)
|
||
btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
|
||
btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal)
|
||
btn.cornerRadius = 18
|
||
return btn
|
||
}()
|
||
|
||
// MARK: - 未解锁vip
|
||
lazy var unlockVipView: UIView = {
|
||
let view = UIView()
|
||
view.backgroundColor = .clear
|
||
view.clipsToBounds = true
|
||
view.isHidden = true
|
||
|
||
let bgImgView = UIImageView(image: UIImage(named: "SearchLocation/result_bg"))
|
||
bgImgView.contentMode = .scaleAspectFill
|
||
view.addSubview(bgImgView)
|
||
bgImgView.layoutChain
|
||
.edges(excludingEdge: .bottom)
|
||
.heightToWidth(457/357)
|
||
|
||
view.addSubview(unlockVipLottieView)
|
||
unlockVipLottieView.layoutChain
|
||
.edgesHorzontal(60)
|
||
.heightToWidth(1)
|
||
.top(150)
|
||
// .bottomToView(bgImgView, offset: -15)
|
||
|
||
view.addSubview(unlockVipPhoneAreaLab)
|
||
unlockVipPhoneAreaLab.layoutChain
|
||
.topToBottomOfView(unlockVipLottieView)
|
||
.centerX()
|
||
|
||
let locationView = UIView()
|
||
locationView.backgroundColor = .clear
|
||
view.addSubview(locationView)
|
||
locationView.layoutChain
|
||
.topToBottomOfView(unlockVipPhoneAreaLab, offset: 10)
|
||
.centerX()
|
||
|
||
let locationTitleLab = UILabel()
|
||
locationTitleLab.text = "位置:"
|
||
locationTitleLab.font = .systemFont(ofSize: 16, weight: .bold)
|
||
locationTitleLab.textColor = UIColor(hexStr: "#16B3FF")
|
||
locationView.addSubview(locationTitleLab)
|
||
locationTitleLab.layoutChain
|
||
.left()
|
||
.centerY()
|
||
|
||
let maskView = UIImageView(image: UIImage(named: "SearchLocation/mask"))
|
||
locationView.addSubview(maskView)
|
||
maskView.layoutChain
|
||
.leftToRightOfView(locationTitleLab)
|
||
.right()
|
||
.edgesVertical()
|
||
.width(144)
|
||
.height(30)
|
||
|
||
let unlockVipBtn = UIButton()
|
||
unlockVipBtn.setTitle("开通会员", for: .normal)
|
||
unlockVipBtn.setTitleColor(.white, for: .normal)
|
||
unlockVipBtn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium)
|
||
unlockVipBtn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal)
|
||
unlockVipBtn.cornerRadius = 25
|
||
unlockVipBtn.rx.tap.subscribe(onNext: { _ in
|
||
AppRouter.push(Route.vipRecharge)
|
||
}).disposed(by: disposeBag)
|
||
|
||
view.addSubview(unlockVipBtn)
|
||
unlockVipBtn.layoutChain
|
||
.edgesHorzontal(15)
|
||
.bottom(kSafeBottomMargin + 20)
|
||
.height(50)
|
||
|
||
// 最后出现地点
|
||
let tipsDot3 = UIView()
|
||
tipsDot3.backgroundColor = UIColor(hexStr: "#16B3FF")
|
||
tipsDot3.cornerRadius = 2.5
|
||
let tipsLab3 = UILabel()
|
||
tipsLab3.text = "最后出现地点"
|
||
tipsLab3.font = .systemFont(ofSize: 12, weight: .medium)
|
||
tipsLab3.textColor = UIColor(hexStr: "#333333")
|
||
view.addSubview(tipsLab3)
|
||
view.addSubview(tipsDot3)
|
||
tipsLab3.layoutChain
|
||
.bottomToTopOfView(unlockVipBtn, offset: -20)
|
||
.rightToCenterXOfView(view, offset: 30)
|
||
|
||
tipsDot3.layoutChain
|
||
.rightToLeftOfView(tipsLab3, offset: -8)
|
||
.width(5)
|
||
.heightToWidth(1)
|
||
.centerY(tipsLab3)
|
||
|
||
// "近24小时轨迹"
|
||
let tipsDot4 = UIView()
|
||
tipsDot4.backgroundColor = UIColor(hexStr: "#16B3FF")
|
||
tipsDot4.cornerRadius = 2.5
|
||
let tipsLab4 = UILabel()
|
||
tipsLab4.text = "近24小时轨迹"
|
||
tipsLab4.font = .systemFont(ofSize: 12, weight: .medium)
|
||
tipsLab4.textColor = UIColor(hexStr: "#333333")
|
||
view.addSubview(tipsLab4)
|
||
view.addSubview(tipsDot4)
|
||
tipsDot4.layoutChain
|
||
.leftToCenterXOfView(view, offset: 30)
|
||
.width(5)
|
||
.heightToWidth(1)
|
||
.centerY(tipsLab4)
|
||
tipsLab4.layoutChain
|
||
.bottomToTopOfView(unlockVipBtn, offset: -20)
|
||
.leftToRightOfView(tipsDot4, offset: 8)
|
||
|
||
// 是否在线
|
||
let tipsDot1 = UIView()
|
||
tipsDot1.backgroundColor = UIColor(hexStr: "#16B3FF")
|
||
tipsDot1.cornerRadius = 2.5
|
||
let tipsLab1 = UILabel()
|
||
tipsLab1.text = "是否在线"
|
||
tipsLab1.font = .systemFont(ofSize: 12, weight: .medium)
|
||
tipsLab1.textColor = UIColor(hexStr: "#333333")
|
||
view.addSubview(tipsLab1)
|
||
view.addSubview(tipsDot1)
|
||
tipsDot1.layoutChain
|
||
.leftToView(tipsDot3)
|
||
.width(5)
|
||
.heightToWidth(1)
|
||
.centerY(tipsLab1)
|
||
tipsLab1.layoutChain
|
||
.bottomToTopOfView(tipsLab3, offset: -10)
|
||
.leftToRightOfView(tipsDot1, offset: 8)
|
||
|
||
// 实时位置变化
|
||
let tipsDot2 = UIView()
|
||
tipsDot2.backgroundColor = UIColor(hexStr: "#16B3FF")
|
||
tipsDot2.cornerRadius = 2.5
|
||
let tipsLab2 = UILabel()
|
||
tipsLab2.text = "实时位置变化"
|
||
tipsLab2.font = .systemFont(ofSize: 12, weight: .medium)
|
||
tipsLab2.textColor = UIColor(hexStr: "#333333")
|
||
view.addSubview(tipsLab2)
|
||
view.addSubview(tipsDot2)
|
||
tipsDot2.layoutChain
|
||
.leftToView(tipsDot4)
|
||
.width(5)
|
||
.heightToWidth(1)
|
||
.centerY(tipsLab2)
|
||
tipsLab2.layoutChain
|
||
.bottomToTopOfView(tipsLab4, offset: -10)
|
||
.leftToRightOfView(tipsDot2, offset: 8)
|
||
|
||
// 再迈一步,你就能看到:
|
||
let unlockVipTitleLab = UILabel()
|
||
unlockVipTitleLab.text = "再迈一步,你就能看到:"
|
||
unlockVipTitleLab.font = .systemFont(ofSize: 14, weight: .medium)
|
||
unlockVipTitleLab.textColor = UIColor(hexStr: "#16B3FF")
|
||
view.addSubview(unlockVipTitleLab)
|
||
unlockVipTitleLab.layoutChain
|
||
.bottomToTopOfView(tipsLab1, offset: -8)
|
||
.centerX()
|
||
|
||
return view
|
||
}()
|
||
|
||
lazy var unlockVipLottieView: LottieAnimationView = {
|
||
let view = LottieAnimationView(name: "phone_search_no_vip")
|
||
view.loopMode = .loop
|
||
return view
|
||
}()
|
||
|
||
lazy var unlockVipPhoneAreaLab: UILabel = {
|
||
let label = UILabel()
|
||
label.text = " "
|
||
label.font = .systemFont(ofSize: 20, weight: .semibold)
|
||
label.textColor = UIColor(hexStr: "#16B3FF")
|
||
return label
|
||
}()
|
||
|
||
override init(frame: CGRect) {
|
||
super.init(frame: .zero)
|
||
backgroundColor = .white
|
||
setupUI()
|
||
setupRx()
|
||
}
|
||
|
||
required init?(coder aDecoder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
}
|