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

//
// 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
}
}