162 lines
4.6 KiB
Swift
162 lines
4.6 KiB
Swift
|
|
//
|
|||
|
|
// FriendsPiecesViews.swift
|
|||
|
|
// Crush
|
|||
|
|
//
|
|||
|
|
// Created by Leon on 2025/8/14.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
import UIKit
|
|||
|
|
|
|||
|
|
/// 当前 heartbeat 排名
|
|||
|
|
class FriendsHeartBeatHead: UIView {
|
|||
|
|
|
|||
|
|
var stackV: UIStackView!
|
|||
|
|
|
|||
|
|
// Part 1
|
|||
|
|
var blockView: UIView!
|
|||
|
|
var queryButton: EPIconGhostButton!
|
|||
|
|
var label: LineSpaceLabel!
|
|||
|
|
|
|||
|
|
// Part 2
|
|||
|
|
var noticeOnceView: FriendsNoticeOnceView!
|
|||
|
|
|
|||
|
|
var heightChangeBlock: ((CGFloat) -> Void)?
|
|||
|
|
override init(frame: CGRect) {
|
|||
|
|
super.init(frame: frame)
|
|||
|
|
setupViews()
|
|||
|
|
setupData()
|
|||
|
|
setupEvent()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
required init?(coder: NSCoder) {
|
|||
|
|
fatalError("init(coder:) has not been implemented")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupViews() {
|
|||
|
|
stackV = {
|
|||
|
|
let v = UIStackView()
|
|||
|
|
v.axis = .vertical
|
|||
|
|
addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.top.equalTo(16)
|
|||
|
|
make.leading.equalToSuperview().offset(8)
|
|||
|
|
make.trailing.equalToSuperview().offset(-8)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
blockView = {
|
|||
|
|
let v = UIView()
|
|||
|
|
v.layer.cornerRadius = 8
|
|||
|
|
v.layer.masksToBounds = true
|
|||
|
|
v.backgroundColor = .c.csbn
|
|||
|
|
// addSubview(v)
|
|||
|
|
// v.snp.makeConstraints { make in
|
|||
|
|
// make.top.equalToSuperview().offset(8)
|
|||
|
|
// make.leading.equalToSuperview().offset(8)
|
|||
|
|
// make.trailing.equalToSuperview().offset(-8)
|
|||
|
|
// }
|
|||
|
|
stackV.addArrangedSubview(v)
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
queryButton = {
|
|||
|
|
let v = EPIconGhostButton(radius: .none, iconSize: .small, iconCode: .faq)
|
|||
|
|
v.addTarget(self, action: #selector(tapQueryButton), for: .touchUpInside)
|
|||
|
|
blockView.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.centerY.equalToSuperview()
|
|||
|
|
make.size.equalTo(v.bgImageSize())
|
|||
|
|
make.trailing.equalToSuperview().offset(-16)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
label = {
|
|||
|
|
let v = LineSpaceLabel()
|
|||
|
|
let typo = CLSystemToken.typography(token: .tls)
|
|||
|
|
v.config(typo)
|
|||
|
|
v.textColor = .text
|
|||
|
|
blockView.addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.leading.equalToSuperview().offset(16)
|
|||
|
|
make.top.equalToSuperview().offset(8)
|
|||
|
|
make.bottom.equalToSuperview().offset(-8)
|
|||
|
|
make.trailing.equalTo(queryButton.snp.leading).offset(8)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
noticeOnceView = {
|
|||
|
|
let v = FriendsNoticeOnceView()
|
|||
|
|
stackV.addArrangedSubview(v)
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
noticeOnceView.isHidden = true
|
|||
|
|
blockView.isHidden = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupData() {
|
|||
|
|
//#warning("test")
|
|||
|
|
// testData()
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
private func testData(){
|
|||
|
|
label.text = "Sum of heartbeat values: top 10.12%"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupEvent() {
|
|||
|
|
noticeOnceView.tapCloseAction = {[weak self] in
|
|||
|
|
self?.blockView.isHidden = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - Public
|
|||
|
|
public func showNoticeOnce(_ show: Bool){
|
|||
|
|
noticeOnceView.isHidden = !show
|
|||
|
|
blockView.isHidden = show
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 0.9 -> 90%
|
|||
|
|
public func config(percent:CGFloat?){
|
|||
|
|
if self.noticeOnceView.isHidden == true{
|
|||
|
|
self.blockView.isHidden = false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let percentValue = percent ?? 0.0
|
|||
|
|
|
|||
|
|
// 限制范围 0 ~ 1,避免传入非法值
|
|||
|
|
let clamped = min(max(percentValue, 0.0), 1.0)
|
|||
|
|
|
|||
|
|
// 转换成百分比,保留两位小数(如果是整数则自动不显示多余小数)
|
|||
|
|
let formatter = NumberFormatter()
|
|||
|
|
formatter.numberStyle = .percent
|
|||
|
|
formatter.minimumFractionDigits = 0
|
|||
|
|
formatter.maximumFractionDigits = 2
|
|||
|
|
|
|||
|
|
let formatPercent = formatter.string(from: NSNumber(value: Double(clamped))) ?? "0%"
|
|||
|
|
|
|||
|
|
// 更新 UI
|
|||
|
|
label.text = "Sum of heartbeat values: top \(formatPercent)"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - Action
|
|||
|
|
@objc private func tapQueryButton() {
|
|||
|
|
let alert = Alert(title: "Tips", text: "与你的心动值达到15.0摄氏度以上的角色作为最为排名对象,按照这些角色心动值总和进行排名")
|
|||
|
|
let action1 = AlertAction(title: "Got it", actionStyle: .confirm) {
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
alert.addAction(action1)
|
|||
|
|
alert.show()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
override func layoutSubviews() {
|
|||
|
|
super.layoutSubviews()
|
|||
|
|
|
|||
|
|
let maxY = stackV.frame.maxY + 8
|
|||
|
|
heightChangeBlock?(maxY)
|
|||
|
|
}
|
|||
|
|
}
|