192 lines
6.2 KiB
Swift
192 lines
6.2 KiB
Swift
|
|
//
|
|||
|
|
// GiftCountChooseController.swift
|
|||
|
|
// Crush
|
|||
|
|
//
|
|||
|
|
// Created by Leon on 2025/8/24.
|
|||
|
|
//
|
|||
|
|
import SnapKit
|
|||
|
|
import UIKit
|
|||
|
|
|
|||
|
|
// MARK: - GiftCountChooseCell
|
|||
|
|
|
|||
|
|
class GiftCountChooseCell: UITableViewCell {
|
|||
|
|
let countLabel: UILabel
|
|||
|
|
let line: UIView
|
|||
|
|
let selectedIcon : UIImageView
|
|||
|
|
|
|||
|
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
|||
|
|
countLabel = UILabel()
|
|||
|
|
line = UIView()
|
|||
|
|
selectedIcon = UIImageView()
|
|||
|
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
|||
|
|
|
|||
|
|
backgroundColor = .clear
|
|||
|
|
contentView.backgroundColor = .clear
|
|||
|
|
selectionStyle = .none
|
|||
|
|
|
|||
|
|
// Setup countLabel
|
|||
|
|
countLabel.textAlignment = .center
|
|||
|
|
countLabel.font = .t.tnms
|
|||
|
|
countLabel.textColor = .text
|
|||
|
|
contentView.addSubview(countLabel)
|
|||
|
|
countLabel.snp.makeConstraints { make in
|
|||
|
|
//make.edges.equalToSuperview()
|
|||
|
|
make.centerY.equalToSuperview()
|
|||
|
|
make.leading.equalToSuperview().offset(16)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
selectedIcon.image = UIImage(named: "checkmark_tick")
|
|||
|
|
contentView.addSubview(selectedIcon)
|
|||
|
|
selectedIcon.snp.makeConstraints { make in
|
|||
|
|
make.centerY.equalToSuperview()
|
|||
|
|
make.trailing.equalToSuperview().offset(-16)
|
|||
|
|
}
|
|||
|
|
selectedIcon.isHidden = true
|
|||
|
|
|
|||
|
|
// Setup line
|
|||
|
|
// line.backgroundColor = .c.con
|
|||
|
|
// contentView.addSubview(line)
|
|||
|
|
// line.snp.makeConstraints { make in
|
|||
|
|
// make.leading.equalToSuperview().offset(8)
|
|||
|
|
// make.trailing.equalToSuperview().offset(-8)
|
|||
|
|
// make.height.equalTo(1)
|
|||
|
|
// make.bottom.equalToSuperview()
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
required init?(coder: NSCoder) {
|
|||
|
|
fatalError("init(coder:) has not been implemented")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - GiftCountChooseController
|
|||
|
|
|
|||
|
|
class GiftCountChooseController: UIViewController {
|
|||
|
|
private let sourceRect: CGRect
|
|||
|
|
private let container: UIView
|
|||
|
|
private let datas: [String]
|
|||
|
|
private let bgImageView: UIImageView
|
|||
|
|
private let tableView: UITableView
|
|||
|
|
private static let cellId = "GiftCountCell"
|
|||
|
|
private static let rowHeight: CGFloat = 48
|
|||
|
|
var selectedValue: String?
|
|||
|
|
|
|||
|
|
var chooseBlock: ((String) -> Void)?
|
|||
|
|
var popoverDismiss: (() -> Void)?
|
|||
|
|
|
|||
|
|
init(sourceRect: CGRect, selectedValue: String? = nil) {
|
|||
|
|
self.sourceRect = sourceRect
|
|||
|
|
self.selectedValue = selectedValue
|
|||
|
|
container = UIView()
|
|||
|
|
container.layer.borderColor = UIColor.c.cpn.cgColor
|
|||
|
|
container.layer.borderWidth = 2
|
|||
|
|
container.layer.cornerRadius = 16
|
|||
|
|
container.layer.masksToBounds = true
|
|||
|
|
|
|||
|
|
datas = ["100", "50", "20", "10", "5", "3", "1"].reversed()
|
|||
|
|
bgImageView = UIImageView()
|
|||
|
|
tableView = UITableView(frame: .zero, style: .plain)
|
|||
|
|
super.init(nibName: nil, bundle: nil)
|
|||
|
|
modalPresentationStyle = .fullScreen
|
|||
|
|
view.backgroundColor = .clear
|
|||
|
|
setupUI()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
required init?(coder: NSCoder) {
|
|||
|
|
fatalError("init(coder:) has not been implemented")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@objc private func close() {
|
|||
|
|
popoverDismiss?()
|
|||
|
|
view.removeFromSuperview()
|
|||
|
|
removeFromParent()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupUI() {
|
|||
|
|
// Background button for dismissal
|
|||
|
|
let button = UIButton()
|
|||
|
|
view.addSubview(button)
|
|||
|
|
button.addTarget(self, action: #selector(close), for: .touchUpInside)
|
|||
|
|
button.snp.makeConstraints { make in
|
|||
|
|
make.edges.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Setup container
|
|||
|
|
let w: CGFloat = 120// 76
|
|||
|
|
let h: CGFloat = 232 //Self.rowHeight * CGFloat(datas.count) + 8
|
|||
|
|
let x: CGFloat = sourceRect.origin.x - (w / 2)
|
|||
|
|
let y: CGFloat = sourceRect.origin.y - 20 - h - 8 // 8: padding for arrow
|
|||
|
|
container.frame = CGRect(x: x, y: y, width: w, height: h)
|
|||
|
|
container.backgroundColor = .c.csfn
|
|||
|
|
view.addSubview(container)
|
|||
|
|
|
|||
|
|
// Setup table view
|
|||
|
|
tableView.dataSource = self
|
|||
|
|
tableView.delegate = self
|
|||
|
|
tableView.rowHeight = Self.rowHeight
|
|||
|
|
tableView.layer.cornerRadius = 8
|
|||
|
|
//tableView.isScrollEnabled = false
|
|||
|
|
tableView.backgroundColor = .clear
|
|||
|
|
tableView.separatorStyle = .none
|
|||
|
|
tableView.tableFooterView = UIView()
|
|||
|
|
tableView.register(GiftCountChooseCell.self, forCellReuseIdentifier: Self.cellId)
|
|||
|
|
container.addSubview(tableView)
|
|||
|
|
tableView.snp.makeConstraints { make in
|
|||
|
|
make.edges.equalToSuperview().inset(UIEdgeInsets(top: 0, left: 0, bottom: 8, right: 0))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 延迟滚动到选中项
|
|||
|
|
DispatchQueue.main.async {
|
|||
|
|
self.scrollToSelectedValue()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func scrollToSelectedValue() {
|
|||
|
|
guard let selectedValue = selectedValue,
|
|||
|
|
let selectedIndex = datas.firstIndex(of: selectedValue) else {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let indexPath = IndexPath(row: selectedIndex, section: 0)
|
|||
|
|
tableView.scrollToRow(at: indexPath, at: .middle, animated: false)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
deinit{
|
|||
|
|
dlog("♻️GiftCountChooseController")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - UITableViewDataSource, UITableViewDelegate
|
|||
|
|
|
|||
|
|
extension GiftCountChooseController: UITableViewDataSource, UITableViewDelegate {
|
|||
|
|
func numberOfSections(in tableView: UITableView) -> Int {
|
|||
|
|
return 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|||
|
|
return datas.count
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|||
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: Self.cellId, for: indexPath) as! GiftCountChooseCell
|
|||
|
|
let currentValue = datas[indexPath.row]
|
|||
|
|
cell.countLabel.text = currentValue
|
|||
|
|
cell.line.isHidden = indexPath.row == datas.count - 1
|
|||
|
|
|
|||
|
|
// 显示选中状态的图标
|
|||
|
|
cell.selectedIcon.isHidden = currentValue != selectedValue
|
|||
|
|
|
|||
|
|
return cell
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|||
|
|
tableView.deselectRow(at: indexPath, animated: false)
|
|||
|
|
let selectedValue = datas[indexPath.row]
|
|||
|
|
self.selectedValue = selectedValue
|
|||
|
|
chooseBlock?(selectedValue)
|
|||
|
|
close()
|
|||
|
|
}
|
|||
|
|
}
|