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

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