105 lines
3.1 KiB
Swift
105 lines
3.1 KiB
Swift
//
|
|
// PasswordInputField.swift
|
|
// suixinkan
|
|
//
|
|
|
|
import SnapKit
|
|
import UIKit
|
|
|
|
/// 登录页密码输入框,对应 Android `PasswordInputField`。
|
|
final class PasswordInputField: UIView {
|
|
|
|
private let textField = UITextField()
|
|
private let toggleButton = UIButton(type: .custom)
|
|
|
|
private var isPasswordVisible = false
|
|
|
|
var text: String {
|
|
get { textField.text ?? "" }
|
|
set { textField.text = newValue }
|
|
}
|
|
|
|
var onTextChange: ((String) -> Void)?
|
|
var onReturnKey: (() -> Void)?
|
|
|
|
init(placeholder: String = "请输入密码") {
|
|
super.init(frame: .zero)
|
|
setupUI(placeholder: placeholder)
|
|
setupConstraints()
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
@discardableResult
|
|
override func becomeFirstResponder() -> Bool {
|
|
textField.becomeFirstResponder()
|
|
}
|
|
|
|
private func setupUI(placeholder: String) {
|
|
backgroundColor = AppColor.inputBackground
|
|
layer.cornerRadius = 12
|
|
clipsToBounds = true
|
|
|
|
textField.font = .systemFont(ofSize: 14)
|
|
textField.textColor = AppColor.text333
|
|
textField.isSecureTextEntry = true
|
|
textField.autocapitalizationType = .none
|
|
textField.autocorrectionType = .no
|
|
textField.returnKeyType = .done
|
|
textField.delegate = self
|
|
|
|
let attributes: [NSAttributedString.Key: Any] = [
|
|
.foregroundColor: AppColor.placeholder,
|
|
.font: UIFont.systemFont(ofSize: 14),
|
|
]
|
|
textField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: attributes)
|
|
textField.addTarget(self, action: #selector(textDidChange), for: .editingChanged)
|
|
|
|
toggleButton.setImage(UIImage(named: "icon_pwd_invisible"), for: .normal)
|
|
toggleButton.addTarget(self, action: #selector(togglePasswordVisibility), for: .touchUpInside)
|
|
|
|
addSubview(textField)
|
|
addSubview(toggleButton)
|
|
}
|
|
|
|
private func setupConstraints() {
|
|
snp.makeConstraints { make in
|
|
make.height.equalTo(46)
|
|
}
|
|
|
|
toggleButton.snp.makeConstraints { make in
|
|
make.trailing.equalToSuperview().inset(8)
|
|
make.centerY.equalToSuperview()
|
|
make.size.equalTo(30)
|
|
}
|
|
|
|
textField.snp.makeConstraints { make in
|
|
make.leading.equalToSuperview().inset(16)
|
|
make.trailing.equalTo(toggleButton.snp.leading).offset(-4)
|
|
make.centerY.equalToSuperview()
|
|
}
|
|
}
|
|
|
|
@objc private func textDidChange() {
|
|
onTextChange?(text)
|
|
}
|
|
|
|
@objc private func togglePasswordVisibility() {
|
|
isPasswordVisible.toggle()
|
|
textField.isSecureTextEntry = !isPasswordVisible
|
|
let imageName = isPasswordVisible ? "icon_pwd_visible" : "icon_pwd_invisible"
|
|
toggleButton.setImage(UIImage(named: imageName), for: .normal)
|
|
}
|
|
}
|
|
|
|
extension PasswordInputField: UITextFieldDelegate {
|
|
|
|
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
|
onReturnKey?()
|
|
return true
|
|
}
|
|
}
|