自定義UITextView,解決大部分會遇到的問題

在我們使用UITextView的過程中,經(jīng)常會遇到增加提示文本和限制字數(shù)的需求,特別是限制字數(shù)時輸入拼音的情況,今天特意研究了下,封裝了一個工具類,先上圖:


實現(xiàn)過程主要是監(jiān)聽以下兩個方法,第一個用于限制輸入,第二個用于計算剩余字數(shù):

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

//該方法會在鍵盤輸入時觸發(fā),返回false時輸入無效

}

func textViewDidChange(_ textView: UITextView) {

//該方法會有textView.text值通過輸入操作(非代碼)變化時觸發(fā)

}


先來看限制輸入方法具體實現(xiàn):

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

//拼接不限制輸入,textview將會得到的值

let jointStr = (textView.text as NSString).replacingCharacters(in: range, with: text)

//得到剩余字數(shù)

let remainNumber = maxNumber - jointStr.length()

//當沒有候選字符,且字數(shù)超過限制時,輸入無效

if self.markedTextRange == nil? && remainNumber < 0 {

????return false

}else {

????return true

}

}


計算剩余字數(shù)方法:

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)

}

}

// 重新設(shè)置光標位置

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 ,有需要的可以去下載看下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容