在我們使用UITextView的過程中,經常會遇到增加提示文本和限制字數的需求,特別是限制字數時輸入拼音的情況,今天特意研究了下,封裝了一個工具類,先上圖:
實現過程主要是監聽以下兩個方法,第一個用于限制輸入,第二個用于計算剩余字數:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
//該方法會在鍵盤輸入時觸發,返回false時輸入無效
}
func textViewDidChange(_ textView: UITextView) {
//該方法會有textView.text值通過輸入操作(非代碼)變化時觸發
}
先來看限制輸入方法具體實現:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
//拼接不限制輸入,textview將會得到的值
let jointStr = (textView.text as NSString).replacingCharacters(in: range, with: text)
//得到剩余字數
let remainNumber = maxNumber - jointStr.length()
//當沒有候選字符,且字數超過限制時,輸入無效
if self.markedTextRange == nil? && remainNumber < 0 {
????return false
}else {
????return true
}
}
計算剩余字數方法:
func textViewDidChange(_ textView: UITextView) {
//判斷提示文本是否顯示
if textView.text.length() == 0 {
self.placeholderLabel.isHidden = false
}else {
self.placeholderLabel.isHidden = true
}
//沒有候選字符,拼音輸入中
if self.markedTextRange == nil {
let text = textView.text as NSString
if (text.length > self.maxNumber) {
// 記錄光標位置
let selectRange = textView.selectedRange
// 防止最后一位是emoji表情
let rangeIndex = text.rangeOfComposedCharacterSequence(at: self.maxNumber)
if? rangeIndex.length == 1 {
textView.text = text.substring(to: self.maxNumber)
}else {
if self.maxNumber == 1 {
textView.text = ""
}else {
textView.text = text.substring(to: self.maxNumber-1)
}
}
// 重新設置光標位置
if selectRange.location > textView.text.length() {
textView.selectedRange = NSRange.init(location: textView.text.length(), length: 0)
}else {
textView.selectedRange = selectRange
}
}
}
}
基本流程就上面這些,需要注意:
1.拼音輸入中判斷self.markedTextRange;
2.記錄光標輸入位置,防止光標跑到末尾;
代碼已上傳至我的github ,有需要的可以去下載看下。