場(chǎng)景
在我們進(jìn)行客戶端開發(fā)的時(shí)候,用戶的反饋意見對(duì)我們來說至關(guān)重要,所以意見反饋也就成為我們必不可少的一個(gè)界面琉苇,大部分意見反饋的頁面都是這個(gè)樣子的
主要分為兩個(gè)功能 ** 默認(rèn)占位文字 ** 輸入限制
目標(biāo)
- 為textView添加默認(rèn)文字(placeholder)
- 限制textView的輸入文字
實(shí)現(xiàn)方法
(一)添加placeholder
添加placeholder的方法有很多滚躯,我采用的是繪制的方法,根據(jù)需要制定繪制的Attributes重寫dranRect方法利用
[self.placeholder drawInRect:rect withAttributes:attrs];
方法講文字繪制在textView上风宁,然后根據(jù)hasText屬性來控制是否繪制
完整功能如下
if (self.hasText) {
return;
}
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSFontAttributeName] = self.font;
attrs[NSForegroundColorAttributeName] = self.placeholderColor==nil?[UIColor blackColor]:self.placeholderColor;
//為了美觀可以稍微偏移一下,具體數(shù)值自己定義
rect.origin.x = 5;
rect.origin.y = 8;
rect.size.width -= 2 * rect.origin.x;
[self.placeholder drawInRect:rect withAttributes:attrs];
要注意的是一般我們會(huì)把placeholder的文字大小定義成跟輸入文字一樣的大小蛹疯,顏色會(huì)自定義所以別忘了重寫textView的font屬性的set方法以及placeholderColor和placeholderString的set方法添加上
[self setNeedsDisplay];
(二)添加字?jǐn)?shù)限制
一般來說監(jiān)聽textView文字變化的方法有兩種
- 根據(jù)delegate中的textViewDidChange方法來監(jiān)聽文字變化
- 添加通知UITextViewTextDidChangeNotification名來監(jiān)聽文字變化
無論哪種方法我們都可以獲取到當(dāng)前textView的文字變化從而進(jìn)行操作戒财,可以通過
if (self.text.length > self.maxInputLength) {
self.text = [self.text substringToIndex:self.maxInputLength];
}
直接將文字截取至限定字符的數(shù)量,但是這樣做有個(gè)問題捺弦,在用蘋果自帶鍵盤輸入的時(shí)候會(huì)發(fā)現(xiàn)輸入不下去的文字饮寞,這是因?yàn)樘O果自帶鍵盤在中文輸入法的時(shí)候會(huì)把拼音以選中高亮的形式輸入進(jìn)textView從而觸發(fā)textView的文字變化到了你限定的數(shù)量就會(huì)輸入不進(jìn)去了 孝扛,所以我們要對(duì)蘋果鍵盤的中文輸入法單獨(dú)做處理
// 獲取選中部分
UITextRange *selectedRange = [self markedTextRange];
//獲取選中部分的偏移量, 此部分為用戶未決定輸入部分
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
通過選中狀態(tài)的有無來判斷是否應(yīng)該進(jìn)行截取。
NSString *InputMethodType = [[UIApplication sharedApplication]textInputMode].primaryLanguage;
// 如果當(dāng)前輸入法為漢語輸入法
if ([InputMethodType isEqualToString:@"zh-Hans"]) {
// 獲取選中部分
UITextRange *selectedRange = [self markedTextRange];
//獲取選中部分的偏移量, 此部分為用戶未決定輸入部分
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
// 當(dāng)沒有標(biāo)記部分時(shí)截取字符串
if (position == nil) {
if (self.text.length > self.maxInputLength) {
self.text = [self.text substringToIndex:self.maxInputLength];
}
}
}else {
if (self.text.length > self.maxInputLength) {
self.text = [self.text substringToIndex:self.maxInputLength];
}
}
至此功能算是都實(shí)現(xiàn)了幽崩,但是為了封裝性和易用性苦始,所以我們還需要整理一下,可以使用分類的方式給UITextView添加上placeholder和maxInputLenth屬性以便更好的使用
具體代碼在git地址上喜歡的話請(qǐng)點(diǎn)個(gè)star哦