121 lines
3.7 KiB
Swift
121 lines
3.7 KiB
Swift
//
|
|
// WalletTextInputView.swift
|
|
// Malinka
|
|
//
|
|
// Created by Nut.Tech on 27.07.2022.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
protocol WalletTextInputViewDelegate: AnyObject {
|
|
func walletUpdateTextOutput(wallet: WalletTextInputView, text: String?)
|
|
}
|
|
|
|
final class WalletTextInputView: UIStackView {
|
|
|
|
private enum Constants {
|
|
static let spacing: CGFloat = 4
|
|
static let textCellCornerRadius: CGFloat = 3
|
|
static let borderWidth: CGFloat = 1
|
|
static let size: CGFloat = 20
|
|
static let fontSize: CGFloat = 16
|
|
}
|
|
|
|
// MARK: - Properties
|
|
|
|
private let length: Int
|
|
private weak var delegate: WalletTextInputViewDelegate?
|
|
private var lettersContainers: [UITextField]
|
|
|
|
// MARK: - Init
|
|
|
|
init(length: Int, delegate: WalletTextInputViewDelegate) {
|
|
self.length = length
|
|
self.lettersContainers = []
|
|
super.init(frame: .zero)
|
|
self.axis = .horizontal
|
|
self.spacing = Constants.spacing
|
|
self.alignment = .leading
|
|
self.distribution = .fillEqually
|
|
for i in 0..<length {
|
|
let textfield = self.createTextCell()
|
|
textfield.delegate = self
|
|
textfield.tag = i
|
|
self.lettersContainers.append(textfield)
|
|
self.addArrangedSubview(textfield)
|
|
}
|
|
self.delegate = delegate
|
|
}
|
|
|
|
required init(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
// MARK: - Methods
|
|
|
|
func hideKeyboard() {
|
|
self.lettersContainers.forEach {
|
|
$0.resignFirstResponder()
|
|
}
|
|
}
|
|
|
|
// MARK: - Private
|
|
|
|
private func createTextCell() -> UITextField {
|
|
let textField = UITextField()
|
|
textField.layer.cornerRadius = Constants.textCellCornerRadius
|
|
textField.clipsToBounds = true
|
|
textField.layer.borderColor = Asset.deepWater.color.cgColor
|
|
textField.layer.borderWidth = Constants.borderWidth
|
|
textField.font = FontFamily.GolosUI.bold.font(size: Constants.fontSize)
|
|
textField.textColor = Asset.dark.color
|
|
textField.textAlignment = .center
|
|
NSLayoutConstraint.activate([
|
|
textField.heightAnchor.constraint(equalToConstant: Constants.size),
|
|
textField.widthAnchor.constraint(equalToConstant: Constants.size)
|
|
])
|
|
return textField
|
|
}
|
|
|
|
private func checkIfAllSymbolsEntered() {
|
|
let string = self.lettersContainers
|
|
.compactMap { $0.text }
|
|
.reduce("", +)
|
|
self.delegate?.walletUpdateTextOutput(wallet: self, text: string.count == self.length ? string : nil)
|
|
}
|
|
}
|
|
|
|
// MARK: - UITextFieldDelegate
|
|
|
|
extension WalletTextInputView: UITextFieldDelegate {
|
|
|
|
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
|
|
|
guard string.matched(.accountName) || string.isEmpty else { return false }
|
|
let newString = (textField.text ?? "").replacingCharacters(in: range, with: string).lowercased()
|
|
if newString.count > 1 {
|
|
let cutted = newString.dropLast()
|
|
textField.text = String(cutted)
|
|
if let field = self.lettersContainers[safe: textField.tag + 1] {
|
|
field.text = string
|
|
field.becomeFirstResponder()
|
|
}
|
|
return false
|
|
}
|
|
|
|
if string.isEmpty {
|
|
textField.text = string
|
|
if let field = self.lettersContainers[safe: textField.tag - 1] {
|
|
field.becomeFirstResponder()
|
|
}
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func textFieldDidEndEditing(_ textField: UITextField) {
|
|
self.checkIfAllSymbolsEntered()
|
|
}
|
|
}
|