You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.8 KiB
149 lines
3.8 KiB
//
|
|
// 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
|
|
}
|
|
}
|