// // UITextField+Ext.swift // GME Remit // // Created by InKwon Devik Kim on 04/07/2019. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import RxSwift import RxCocoa public enum GMEKeyboardType: String { case alphabet = "A" case alphabetNumberic = "AN" case alphabetNumbericSpecial = "ANS" case alphabetNumbericSpecialWithoutSpace = "ANW" case numberic = "N" } extension UITextField { func filterBy(type: GMEKeyboardType, isSendAction: Bool = true, isUppercase: Bool = false) { let extractText: String? let value = isUppercase ? text?.uppercased() : text switch type { case .alphabet: extractText = value?.extract(regex: "[A-Za-z\\s]") case .alphabetNumberic: extractText = value?.extract(regex: "[A-Z0-9a-z\\s]") case .alphabetNumbericSpecialWithoutSpace: extractText = value?.extract(regex: "[a-zA-Z0-9]") case .alphabetNumbericSpecial: extractText = value?.filter { $0.isASCII } case .numberic: extractText = text?.extract(regex: "[0-9]") } if text != extractText { text = extractText if isSendAction { sendActions(for: .valueChanged) } } } func filterBy(regex: String, isSendAction: Bool = true) { let extractText = text?.extract(regex: regex) if text != extractText { text = extractText if isSendAction { sendActions(for: .valueChanged) } } } func removeNonASCII(isSendAction: Bool = true) { guard let inputText = text else { return } text = inputText.filter { $0.isASCII } if text != inputText && isSendAction { sendActions(for: .editingChanged) } } func filterForUserIDFormat(isSendAction: Bool = true) { let extractText = text?.extract(regex: "[A-Z0-9a-z._@-]") if text != extractText { text = extractText if isSendAction { sendActions(for: .editingChanged) } } } } extension UITextField { private var leftViewPadding: CGFloat { return 8 } private var widthOfImageInLeftView: CGFloat { return 35 } func setCoutryFlag(with code: String?) { guard let code = code?.lowercased(), let countryCode = CountryEnum(rawValue: code) else { return } setCoutryFlag(with: countryCode) } func setCoutryFlag(with code: CountryEnum) { let imageView = UIImageView( frame: CGRect(x: leftViewPadding, y: 0, width: widthOfImageInLeftView, height: frame.height) ) imageView.contentMode = .scaleAspectFit imageView.image = code.flag let label = UILabel() label.font = font ?? UIFont.systemFont(ofSize: 14) label.textColor = textColor ?? .black label.text = code.phoneCode label.frame = CGRect( x: leftViewPadding + widthOfImageInLeftView + leftViewPadding, y: 0, width: label.intrinsicContentSize.width, height: frame.height ) let paddingView = UIView( frame: CGRect( x: 0, y: 0, width: leftViewPadding + label.intrinsicContentSize.width + widthOfImageInLeftView + leftViewPadding, height: frame.height ) ) paddingView.addSubview(imageView) paddingView.addSubview(label) paddingView.backgroundColor = .clear leftViewMode = .always leftView = paddingView } } extension Reactive where Base: UITextField { public func filterBy(_ type: GMEKeyboardType, isUppercase: Bool = false) -> Disposable { let disposable = self.base.rx.controlEvent(.editingChanged) .subscribe(onNext: { self.base.filterBy(type: type, isUppercase: isUppercase) }) return disposable } public func filterBy(_ regex: String) -> Disposable { let disposable = self.base.rx.controlEvent(.editingChanged) .subscribe(onNext: { self.base.filterBy(regex: regex) }) return disposable } }