UITextField+Extension.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //
  2. // UITextField+Extension.swift
  3. // QuickSearchLocation
  4. //
  5. // Created by mac on 2024/4/12.
  6. //
  7. import UIKit
  8. extension UITextField {
  9. // MARK: 是否都是数字
  10. /// 是否都是数字
  11. /// - Returns: 返回结果
  12. func validateDigits() -> Bool {
  13. let digitsRegEx = "[0-9]*"
  14. let digitsTest = NSPredicate(format: "SELF MATCHES %@", digitsRegEx)
  15. return digitsTest.evaluate(with: self.text)
  16. }
  17. // MARK: 设置富文本的占位符
  18. /// 设置富文本的占位符
  19. /// - Parameters:
  20. /// - font: 字体的大小
  21. /// - color: 字体的颜色
  22. func setPlaceholderAttribute(font: UIFont, color: UIColor = .black) {
  23. let arrStr = NSMutableAttributedString(string: self.placeholder ?? "", attributes: [NSAttributedString.Key.foregroundColor: color, NSAttributedString.Key.font: font])
  24. self.attributedPlaceholder = arrStr
  25. }
  26. }
  27. /// 默认最大输入字数为15
  28. var maxTextNumberDefault = 11
  29. // MARK: 设置最大输入字数
  30. extension UITextField {
  31. /// 以runtime的形式UITextField添加最大输入字数属性
  32. public var maxTextNumber: Int {
  33. set {
  34. objc_setAssociatedObject(self, &maxTextNumberDefault, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY_NONATOMIC)
  35. self.addChangeTextTarget()
  36. }
  37. get {
  38. if let rs = objc_getAssociatedObject(self, &maxTextNumberDefault) as? Int {
  39. return rs
  40. }
  41. return 15
  42. }
  43. }
  44. /// 添加限制最大输入字数target
  45. public func addChangeTextTarget(){
  46. self.addTarget(self, action: #selector(changeText), for: .editingChanged)
  47. }
  48. @objc private func changeText(){
  49. //判断是不是在拼音状态,拼音状态不截取文本
  50. if let positionRange = self.markedTextRange{
  51. guard self.position(from: positionRange.start, offset: 0) != nil else {
  52. checkTextFieldText()
  53. return
  54. }
  55. }else {
  56. checkTextFieldText()
  57. }
  58. }
  59. /// 检测如果输入数高于设置最大输入数则截取
  60. private func checkTextFieldText(){
  61. guard (self.text?.utf16.count)! <= maxTextNumber else {
  62. guard let text = self.text else {
  63. return
  64. }
  65. /// emoji的utf16.count是2,所以不能以maxTextNumber进行截取,改用text.count-1
  66. let sIndex = text.index(text
  67. .startIndex, offsetBy: text.count-1)
  68. self.text = String(text[..<sIndex])
  69. return
  70. }
  71. }
  72. }