杨锴
2025-04-16 09a372bc45fde16fd42257ab6f78b8deeecf720b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//
//  IdCardView.swift
//  XQMuse
//
//  Created by 无故事王国 on 2024/8/21.
//
 
import UIKit
class IDCardView: UIView {
 
                var box:Box<String>!
 
                private let VIEW_HEIGHT:Double = 200
                private let SafeInserts =  UIApplication.shared.keyWindow?.safeAreaInsets ?? .zero
                private var screenW = UIScreen.main.bounds.size.width
                private var avgCellW:Double!
                private var avgCellH:Double!
                private var cellItems = ["1","2","3","4","5","6","7","8","9","X","0","Del"]
                private var content:String = ""
                private var btn_X:UIButton!
                private var btn_Del:UIButton!
 
                override init(frame: CGRect) {
                                super.init(frame: frame)
 
                                setUI()
                                box = Box()
                }
 
                private func setUI(){
                                avgCellW = screenW / 3.0
                                avgCellH = VIEW_HEIGHT / 4.0
                                frame = CGRect(center: .zero, size: CGSize(width: screenW, height: VIEW_HEIGHT + SafeInserts.bottom))
                                backgroundColor = .white
 
                                for (index,item) in cellItems.enumerated() {
                                                let i = Double(index).truncatingRemainder(dividingBy: 3.0)
                                                let j = floor(Double(index) / 3.0)
                                                let btn = createButton(text: item, indexTag: index)
                                                btn.frame = CGRect(x: i * avgCellW, y: j * avgCellH, width: avgCellW, height: avgCellH)
                                                btn.layer.borderColor = UIColor.gray.withAlphaComponent(0.2).cgColor
                                                btn.layer.borderWidth = 0.5
                                                btn.setTitleColor(.gray.withAlphaComponent(0.2), for: .disabled)
                                                addSubview(btn)
                                }
                }
 
                private func createButton(text:String,indexTag:Int)->UIButton{
                                let btn = UIButton(type: .roundedRect)
                                if text == "Del"{
                                                if #available(iOS 13.0, *) {
                                                                btn.setImage(UIImage(systemName: "delete.left")?.withTintColor(.black), for: .normal)
                                                } else {
                                                                btn.setTitle("Del", for: .normal)
                                                }
                                }else{
                                                btn.setTitle(text, for: .normal)
                                }
                                btn.tag = 10 + indexTag
                                btn.titleLabel?.font = UIFont.systemFont(ofSize: 20, weight: .medium)
                                btn.setTitleColor(.black, for: .normal)
                                btn.addTarget(self, action: #selector(tapAction(_:)), for: .touchUpInside)
                                btn.setTitleColor(.gray, for: .highlighted)
 
                                if  text == "X"{
                                                btn_X = btn;btn_X.isEnabled = false
                                }
 
                                if text == "Del"{
                                                btn_Del = btn
                                                let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(longGesture))
                                                btn_Del.addGestureRecognizer(longGesture)
                                }
 
                                return btn
                }
 
                @objc private  func tapAction(_ btn:UIButton){
                                guard let text = btn.titleLabel?.text else {
                                                if !content.isEmpty{content.removeLast()}
                                                box.value = content
                                                btn_X.isEnabled = content.count == 17
                                                return
                                }
 
                                if content.count <= 17{
                                                content.append(text)
                                }
                                btn_X.isEnabled = content.count == 17
                                box.value = content
                }
 
                @objc private func longGesture(_ gesture:UILongPressGestureRecognizer){
                                if content.count > 0{
                                                content.removeLast()
                                                box.value = content
                                }
 
                }
 
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
}
 
final class Box<T> {
                // 声明一个别名
                typealias Listener = (T) -> Void
                var listener: Listener?
 
                var value: T? {
                                didSet {
                                                guard let v = value else { return }
                                                listener?(v)
                                }
                }
 
                init(_ value: T? = nil){
                                self.value = value
                }
 
                func bind(listener: Listener?) {
                                self.listener = listener
                                guard let v = value else { return }
                                listener?(v)
                }
}