418 lines
12 KiB
Swift
418 lines
12 KiB
Swift
|
|
//
|
|||
|
|
// MeetMatchedController.swift
|
|||
|
|
// Crush
|
|||
|
|
//
|
|||
|
|
// Created by Leon on 2025/9/10.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
import UIKit
|
|||
|
|
|
|||
|
|
class MeetMatchedController: CLBaseViewController {
|
|||
|
|
var bgImageView: CLImageView!
|
|||
|
|
var effectView: UIVisualEffectView!
|
|||
|
|
|
|||
|
|
var titleWordsContainer: UIView!
|
|||
|
|
var nameAndAgeLabel: CLLabel!
|
|||
|
|
var likeAndCountLabel: CLIconLabel!
|
|||
|
|
|
|||
|
|
var bottomButtonsStackV: UIStackView!
|
|||
|
|
var chatButton: StyleButton!
|
|||
|
|
var cancelButton: StyleButton!
|
|||
|
|
|
|||
|
|
// -- 中间部分
|
|||
|
|
var middleContainer: UIView!
|
|||
|
|
var middleStackV: UIStackView!
|
|||
|
|
// - Avatar
|
|||
|
|
var avatarsContainer: UIView!
|
|||
|
|
var avatarsStackH: UIStackView!
|
|||
|
|
var leftAvatar: CLImageView!
|
|||
|
|
var rightAvatar: CLImageView!
|
|||
|
|
var heartIcon: UIImageView!
|
|||
|
|
// - Gift (可选)
|
|||
|
|
var giftIcon: UIImageView!
|
|||
|
|
// 赠送的礼物数量(可选
|
|||
|
|
var giftCountBadge: BadgeView!
|
|||
|
|
// - Matched
|
|||
|
|
var matchedContainer: UIView!
|
|||
|
|
var matchedLabel: ColorLabel!
|
|||
|
|
// - Desc
|
|||
|
|
var descLabel: CLLabel!
|
|||
|
|
|
|||
|
|
// - Data
|
|||
|
|
var card: MeetCard?
|
|||
|
|
var info: MeetMatchInfo?
|
|||
|
|
|
|||
|
|
// 可选
|
|||
|
|
var gift: GiftDictModel?
|
|||
|
|
// 礼物数量
|
|||
|
|
var giftCount: Int = 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
override func viewDidLoad() {
|
|||
|
|
super.viewDidLoad()
|
|||
|
|
|
|||
|
|
// Do any additional setup after loading the view.
|
|||
|
|
|
|||
|
|
setupViews()
|
|||
|
|
setupDatas()
|
|||
|
|
setupEvents()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupViews() {
|
|||
|
|
navigationView.backButton.isHidden = true
|
|||
|
|
navigationView.bgView.alpha = 0
|
|||
|
|
|
|||
|
|
bgImageView = {
|
|||
|
|
let v = CLImageView()
|
|||
|
|
view.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.edges.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
effectView = {
|
|||
|
|
let v = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
|
|||
|
|
v.alpha = 1
|
|||
|
|
view.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.edges.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
titleWordsContainer = {
|
|||
|
|
let v = UIView()
|
|||
|
|
view.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.leading.trailing.equalToSuperview()
|
|||
|
|
make.top.equalTo(navigationView.snp.bottom)
|
|||
|
|
make.height.equalTo(60)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
nameAndAgeLabel = {
|
|||
|
|
let v = CLLabel()
|
|||
|
|
v.font = .t.ttm
|
|||
|
|
v.textAlignment = .center
|
|||
|
|
titleWordsContainer.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.leading.equalToSuperview().offset(16)
|
|||
|
|
make.trailing.equalToSuperview().offset(-16)
|
|||
|
|
make.top.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
likeAndCountLabel = {
|
|||
|
|
let v = CLIconLabel()
|
|||
|
|
v.iconSize = CGSize(width: 20, height: 20)
|
|||
|
|
v.iconImageView.image = MWIconFont.image(fromIcon: .like, size: CGSize(width: 20, height: 20), color: .white)
|
|||
|
|
v.contentLabel.font = .t.tnds
|
|||
|
|
v.contentLabel.text = "-"
|
|||
|
|
titleWordsContainer.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.bottom.equalToSuperview()
|
|||
|
|
make.centerX.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
bottomButtonsStackV = {
|
|||
|
|
let v = UIStackView()
|
|||
|
|
v.axis = .vertical
|
|||
|
|
v.spacing = 24
|
|||
|
|
view.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.leading.equalToSuperview().offset(48)
|
|||
|
|
make.trailing.equalToSuperview().offset(-48)
|
|||
|
|
make.bottom.equalToSuperview().offset(-16 - UIWindow.safeAreaBottom * 0.5)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
chatButton = {
|
|||
|
|
let v = StyleButton()
|
|||
|
|
v.primary(size: .large)
|
|||
|
|
v.addTarget(self, action: #selector(chatButtonAction), for: .touchUpInside)
|
|||
|
|
bottomButtonsStackV.addArrangedSubview(v)
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
cancelButton = {
|
|||
|
|
let v = StyleButton()
|
|||
|
|
v.tertiary(size: .large)
|
|||
|
|
v.addTarget(self, action: #selector(cancelButtonAction), for: .touchUpInside)
|
|||
|
|
bottomButtonsStackV.addArrangedSubview(v)
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
middleContainer = {
|
|||
|
|
let v = UIView()
|
|||
|
|
view.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.leading.trailing.equalToSuperview()
|
|||
|
|
make.top.equalTo(titleWordsContainer.snp.bottom)
|
|||
|
|
make.bottom.equalTo(bottomButtonsStackV.snp.top).offset(0)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
middleStackV = {
|
|||
|
|
let v = UIStackView()
|
|||
|
|
v.axis = .vertical
|
|||
|
|
v.alignment = .center
|
|||
|
|
middleContainer.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
//make.centerX.equalToSuperview()
|
|||
|
|
make.leading.equalToSuperview().offset(48)
|
|||
|
|
make.trailing.equalToSuperview().offset(-48)
|
|||
|
|
make.centerY.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
avatarsContainer = {
|
|||
|
|
let v = UIView()
|
|||
|
|
middleStackV.addArrangedSubview(v)
|
|||
|
|
// v.snp.makeConstraints { make in
|
|||
|
|
// make.height.equalTo(128)
|
|||
|
|
// }
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
avatarsStackH = {
|
|||
|
|
let v = UIStackView()
|
|||
|
|
v.axis = .horizontal
|
|||
|
|
v.spacing = 16
|
|||
|
|
avatarsContainer.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.edges.equalToSuperview()
|
|||
|
|
make.height.equalTo(128)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
leftAvatar = {
|
|||
|
|
let v = CLImageView()
|
|||
|
|
v.cornerRadius = 64
|
|||
|
|
avatarsStackH.addArrangedSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.width.equalTo(128)
|
|||
|
|
make.height.equalTo(128)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
rightAvatar = {
|
|||
|
|
let v = CLImageView()
|
|||
|
|
v.cornerRadius = 64
|
|||
|
|
avatarsStackH.addArrangedSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.width.equalTo(128)
|
|||
|
|
make.height.equalTo(128)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
heartIcon = {
|
|||
|
|
let v = UIImageView()
|
|||
|
|
v.image = UIImage(named: "chat_level_heart")
|
|||
|
|
avatarsContainer.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
// make.centerX.equalToSuperview()
|
|||
|
|
make.center.equalToSuperview()
|
|||
|
|
make.size.equalTo(CGSize(width:60, height: 60))
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
giftIcon = {
|
|||
|
|
let v = UIImageView()
|
|||
|
|
v.image = UIImage(named: "chat_level_gift")
|
|||
|
|
middleStackV.addArrangedSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.size.equalTo(CGSize(width:72, height: 72))
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
giftCountBadge = {
|
|||
|
|
let v = BadgeView()
|
|||
|
|
giftIcon.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.trailing.equalToSuperview()
|
|||
|
|
make.top.equalToSuperview().offset(4)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
matchedContainer = {
|
|||
|
|
let v = UIView()
|
|||
|
|
middleStackV.addArrangedSubview(v)
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
matchedLabel = {
|
|||
|
|
let v = ColorLabel()
|
|||
|
|
v.applyGradient(.theme)
|
|||
|
|
v.font = .t.tdxl
|
|||
|
|
v.textColor = .white
|
|||
|
|
matchedContainer.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.leading.trailing.equalToSuperview()
|
|||
|
|
make.top.equalToSuperview().offset(24)
|
|||
|
|
make.bottom.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
descLabel = {
|
|||
|
|
let v = CLLabel()
|
|||
|
|
v.font = .t.tbm
|
|||
|
|
v.textAlignment = .center
|
|||
|
|
v.textColor = .white
|
|||
|
|
v.numberOfLines = 2
|
|||
|
|
middleStackV.addArrangedSubview(v)
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
// view.backgroundColor = .clear
|
|||
|
|
|
|||
|
|
chatButton.setTitle("Chat", for: .normal)
|
|||
|
|
cancelButton.setTitle("Cancel", for: .normal)
|
|||
|
|
matchedLabel.text = "Matched"
|
|||
|
|
|
|||
|
|
// #warning("test")
|
|||
|
|
// testData()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func testData(){
|
|||
|
|
nameAndAgeLabel.text = "Angelique, 28"
|
|||
|
|
giftCountBadge.badgeValue = 99
|
|||
|
|
descLabel.text = "Thank you for your 99 gift names"
|
|||
|
|
likeAndCountLabel.contentLabel.text = "1.2k"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupDatas() {
|
|||
|
|
|
|||
|
|
rightAvatar.loadImage(UserCore.shared.user?.headImage)
|
|||
|
|
|
|||
|
|
// 配置数据
|
|||
|
|
configCardData()
|
|||
|
|
configGiftData()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupEvents() {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - Data Configuration
|
|||
|
|
|
|||
|
|
/// 配置卡片数据
|
|||
|
|
private func configCardData() {
|
|||
|
|
|
|||
|
|
if let data = self.card {
|
|||
|
|
// 配置姓名和年龄
|
|||
|
|
if let nickname = data.nickname, let age = data.age {
|
|||
|
|
nameAndAgeLabel.text = "\(nickname), \(age)"
|
|||
|
|
|
|||
|
|
} else if let nickname = data.nickname {
|
|||
|
|
nameAndAgeLabel.text = nickname
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
descLabel.text = "You and \(data.nickname ?? "-") are moved by each other"
|
|||
|
|
|
|||
|
|
// 配置点赞数
|
|||
|
|
if let likedCount = data.likedCount {
|
|||
|
|
let displayCount = String.displayNumber(NSNumber(value: likedCount), scale: 1)
|
|||
|
|
likeAndCountLabel.contentLabel.text = displayCount
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bgImageView.loadImage(data.imageUrl)
|
|||
|
|
leftAvatar.loadImage(data.headImg)
|
|||
|
|
}
|
|||
|
|
else if let data = info{
|
|||
|
|
if let nickname = data.nickname, let birthday = data.birthday {
|
|||
|
|
let date = Date.dateFromMilliseconds(Int64(birthday))
|
|||
|
|
let ageYears = Date().years(from: date)
|
|||
|
|
nameAndAgeLabel.text = "\(nickname), \(ageYears)"
|
|||
|
|
|
|||
|
|
} else if let nickname = data.nickname {
|
|||
|
|
nameAndAgeLabel.text = nickname
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
descLabel.text = "You and \(data.nickname ?? "-") are moved by each other"
|
|||
|
|
|
|||
|
|
// 配置点赞数
|
|||
|
|
if let likedCount = data.likedCount {
|
|||
|
|
let displayCount = String.displayNumber(NSNumber(value: likedCount), scale: 1)
|
|||
|
|
likeAndCountLabel.contentLabel.text = displayCount
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bgImageView.loadImage(data.homeImageUrl)
|
|||
|
|
leftAvatar.loadImage(data.headImg)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 配置礼物数据
|
|||
|
|
private func configGiftData() {
|
|||
|
|
guard let gift = gift else {
|
|||
|
|
// 如果没有礼物,隐藏礼物相关UI
|
|||
|
|
giftIcon.isHidden = true
|
|||
|
|
giftCountBadge.isHidden = true
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 显示礼物图标
|
|||
|
|
giftIcon.isHidden = false
|
|||
|
|
giftIcon.loadImage(gift.icon, bgColor: .clear)
|
|||
|
|
|
|||
|
|
// 配置礼物数量徽章
|
|||
|
|
if giftCount > 0 {
|
|||
|
|
giftCountBadge.isHidden = false
|
|||
|
|
giftCountBadge.badgeValue = giftCount
|
|||
|
|
} else {
|
|||
|
|
giftCountBadge.isHidden = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新描述文本,包含礼物信息
|
|||
|
|
if let giftName = gift.name, giftCount > 0 {
|
|||
|
|
let giftText = "Thank you for your \(giftCount) \(giftName)"
|
|||
|
|
descLabel.text = giftText
|
|||
|
|
}else if let giftName = gift.name{
|
|||
|
|
let giftText = "Thank you for your \(giftName)"
|
|||
|
|
descLabel.text = giftText
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 公共方法:配置页面数据
|
|||
|
|
func configData(card: MeetCard?, gift: GiftDictModel?, giftCount: Int = 0) {
|
|||
|
|
self.card = card
|
|||
|
|
self.gift = gift
|
|||
|
|
self.giftCount = giftCount
|
|||
|
|
|
|||
|
|
// 重新配置数据
|
|||
|
|
configCardData()
|
|||
|
|
configGiftData()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - Action
|
|||
|
|
|
|||
|
|
@objc func chatButtonAction() {
|
|||
|
|
guard let aiId = card?.aiId else{
|
|||
|
|
dismiss(animated: false)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
self.dismiss(animated: true) {
|
|||
|
|
AppRouter.goChatVC(aiId: aiId)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@objc func cancelButtonAction() {
|
|||
|
|
// self.removeFromParent()
|
|||
|
|
// self.view.removeFromSuperview()
|
|||
|
|
close()
|
|||
|
|
}
|
|||
|
|
}
|