// // 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.. 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() } }