// // TextField.swift // VDSSample // // Created by Matt Bruce on 8/24/22. // import Foundation import UIKit import VDS import VDSFormControlsTokens import Combine public class TextField: UITextField { public var isNumeric: Bool = false public var textPadding = UIEdgeInsets( top: 10, left: 10, bottom: 10, right: 10 ) public override init(frame: CGRect) { super.init(frame: frame) font = TextStyle.bodyLarge.font setup() } public required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } public func setup() { let keypadToolbar: UIToolbar = UIToolbar() // add a done button to the numberpad keypadToolbar.items=[ UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil), UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: self, action: #selector(UITextField.resignFirstResponder)) ] keypadToolbar.sizeToFit() // add a toolbar with a done button above the number pad inputAccessoryView = keypadToolbar keyboardType = .alphabet returnKeyType = .done } public override func textRect(forBounds bounds: CGRect) -> CGRect { layer.borderColor = UIColor.black.cgColor layer.borderWidth = VDSFormControls.widthBorder let rect = super.textRect(forBounds: bounds) return rect.inset(by: textPadding) } public override func editingRect(forBounds bounds: CGRect) -> CGRect { layer.borderColor = UIColor.black.cgColor layer.borderWidth = VDSFormControls.widthBorder let rect = super.editingRect(forBounds: bounds) return rect.inset(by: textPadding) } } public class NumericField: TextField { public override init(frame: CGRect) { super.init(frame: frame) isNumeric = true } public required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } public override func setup() { super.setup() keyboardType = .numberPad } public var number: NSNumber? { guard let text, let foundNumber = NumberFormatter().number(from: text) else { return nil } return foundNumber } public var numberPublisher: AnyPublisher { publisher(for: .editingChanged) .map { _ in self.number ?? nil } .eraseToAnyPublisher() } }