Swift UITextField 的自定义封装

511 阅读1分钟

方便项目调用,按个人项目需求自定义封装

import UIKit

class MySpaceTextField: UITextField {

   @objc required public init?(coder: NSCoder) {
       super.init(coder: coder)
       
       self.addTarget(self, action: #selector(restrictedCharacterChange(target:)), for: UIControl.Event.editingChanged)
   }
   

   @objc override public init(frame: CGRect)  {
       super.init(frame: frame)
       
       self.addTarget(self, action: #selector(restrictedCharacterChange(target:)), for: UIControl.Event.editingChanged)
   }

   @IBInspectable open var limitWords = 50
   @IBInspectable open var limitFirstWordsWhitespacesAndNewlines = true
   // 2022.0424.add
   @IBInspectable var placeHolderColor: UIColor? {
          get {
              return self.placeHolderColor
          }
          set {
              self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: newValue!])
          }
      }
   
   @objc internal func restrictedCharacterChange(target textField: YJSpaceTextField) {
       
       let selectedRange = textField.markedTextRange
       let pos = textField.position(from: textField.beginningOfDocument, offset: 0)
       
       if (selectedRange != nil) && (pos != nil) {
           return
       }
       
       guard let text = textField.text else {
           return
       }
       
       var tempText = text
       
       if tempText.count >= limitWords {
           tempText = String(text.prefix(limitWords))
       }
       
       let firstWordsIsWhitespacesOrNewlines = tempText.first == " " || tempText.first == "\n"
   
       if limitFirstWordsWhitespacesAndNewlines && firstWordsIsWhitespacesOrNewlines {
           tempText = text.trimmingCharacters( in : .whitespacesAndNewlines)
       }
       
       
       let newRange = textField.selectedRange()
       textField.text = tempText
       if (newRange.location <= limitWords) {
           textField.setSelectedRange(newRange)
       }
   }

   func selectedRange() -> NSRange {
       
       guard let start = self.selectedTextRange?.start, let end = self.selectedTextRange?.end  else {
           return NSRange(location: 0, length: 0)
       }
       
       let location    = self.offset(from: self.beginningOfDocument, to: start)
       let length      = self.offset(from: start, to: end)
       
       return NSRange(location: location, length: length)
   }

   func setSelectedRange(selectedRange: NSRange) {
       guard let startPosition = self.position(from: self.beginningOfDocument, offset: selectedRange.location),
             let endPosition   = self.position(from: self.beginningOfDocument, offset: selectedRange.location + selectedRange.length) else {
           return
       }
       
       self.selectedTextRange = self.textRange(from:startPosition, to: endPosition)

   }
}