方便项目调用,按个人项目需求自定义封装
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)
}
}