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)
 | ||
|     }
 | ||
| }
 |