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.

146 lines
3.7 KiB

  1. //
  2. // UITextField+Ext.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon Devik Kim on 04/07/2019.
  6. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import RxSwift
  10. import RxCocoa
  11. public enum GMEKeyboardType: String {
  12. case alphabet = "A"
  13. case alphabetNumberic = "AN"
  14. case alphabetNumbericSpecial = "ANS"
  15. case numberic = "N"
  16. }
  17. extension UITextField {
  18. func filterBy(type: GMEKeyboardType, isSendAction: Bool = true, isUppercase: Bool = false) {
  19. let extractText: String?
  20. let value = isUppercase ? text?.uppercased() : text
  21. switch type {
  22. case .alphabet: extractText = value?.extract(regex: "[A-Za-z\\s]")
  23. case .alphabetNumberic: extractText = value?.extract(regex: "[A-Z0-9a-z\\s]")
  24. case .alphabetNumbericSpecial: extractText = value?.filter { $0.isASCII }
  25. case .numberic: extractText = text?.extract(regex: "[0-9]")
  26. }
  27. if text != extractText {
  28. text = extractText
  29. if isSendAction {
  30. sendActions(for: .valueChanged)
  31. }
  32. }
  33. }
  34. func filterBy(regex: String, isSendAction: Bool = true) {
  35. let extractText = text?.extract(regex: regex)
  36. if text != extractText {
  37. text = extractText
  38. if isSendAction {
  39. sendActions(for: .valueChanged)
  40. }
  41. }
  42. }
  43. func removeNonASCII(isSendAction: Bool = true) {
  44. guard let inputText = text else { return }
  45. text = inputText.filter { $0.isASCII }
  46. if text != inputText && isSendAction {
  47. sendActions(for: .editingChanged)
  48. }
  49. }
  50. func filterForUserIDFormat(isSendAction: Bool = true) {
  51. let extractText = text?.extract(regex: "[A-Z0-9a-z._@-]")
  52. if text != extractText {
  53. text = extractText
  54. if isSendAction {
  55. sendActions(for: .editingChanged)
  56. }
  57. }
  58. }
  59. }
  60. extension UITextField {
  61. private var leftViewPadding: CGFloat {
  62. return 8
  63. }
  64. private var widthOfImageInLeftView: CGFloat {
  65. return 35
  66. }
  67. func setCoutryFlag(with code: String?) {
  68. guard
  69. let code = code?.lowercased(),
  70. let countryCode = CountryEnum(rawValue: code) else { return }
  71. setCoutryFlag(with: countryCode)
  72. }
  73. func setCoutryFlag(with code: CountryEnum) {
  74. let imageView = UIImageView(
  75. frame: CGRect(x: leftViewPadding, y: 0, width: widthOfImageInLeftView, height: frame.height)
  76. )
  77. imageView.contentMode = .scaleAspectFit
  78. imageView.image = code.flag
  79. let label = UILabel()
  80. label.font = font ?? UIFont.systemFont(ofSize: 14)
  81. label.textColor = textColor ?? .black
  82. label.text = code.phoneCode
  83. label.frame = CGRect(
  84. x: leftViewPadding + widthOfImageInLeftView + leftViewPadding,
  85. y: 0,
  86. width: label.intrinsicContentSize.width,
  87. height: frame.height
  88. )
  89. let paddingView = UIView(
  90. frame: CGRect(
  91. x: 0,
  92. y: 0,
  93. width: leftViewPadding + label.intrinsicContentSize.width + widthOfImageInLeftView + leftViewPadding,
  94. height: frame.height
  95. )
  96. )
  97. paddingView.addSubview(imageView)
  98. paddingView.addSubview(label)
  99. paddingView.backgroundColor = .clear
  100. leftViewMode = .always
  101. leftView = paddingView
  102. }
  103. }
  104. extension Reactive where Base: UITextField {
  105. public func filterBy(_ type: GMEKeyboardType, isUppercase: Bool = false) -> Disposable {
  106. let disposable = self.base.rx.controlEvent(.editingChanged)
  107. .subscribe(onNext: {
  108. self.base.filterBy(type: type, isUppercase: isUppercase)
  109. })
  110. return disposable
  111. }
  112. public func filterBy(_ regex: String) -> Disposable {
  113. let disposable = self.base.rx.controlEvent(.editingChanged)
  114. .subscribe(onNext: {
  115. self.base.filterBy(regex: regex)
  116. })
  117. return disposable
  118. }
  119. }