### 需求:
1. textView 需求placeholder用來提示輸出
2. textView 要做字數限制
3. textView 制止表情符號的輸出
### 考慮:
由於需求比擬通用,便想經過自定義SJTextView來完成:
1. placeholder 經過在textView上添加一個通明的label,輸出開端後隱藏完成。
2. 字數限制可以在代理辦法中完成,字數到達最大後制止輸出
3. 表情符號制止輸出(這個不常用,由於我們服務器不接納,於是做了限制輸出),用了github中 [SearchEmojiOnString-IOS](https://github.com/GabrielMassana/SearchEmojiOnString-IOS) 關於表情的 NSString+EMOEmoji 可以很方便完成
問題:假如在自定義SJTextView時運用了UITextView的代理辦法,假如在運用這個自定義的TextView中再運用代理辦法,就會掩蓋SJTextView中的代理辦法。
處理:UITextVeiw 給了三種編輯形態 `UITextViewTextDidBeginEditingNotification UITextViewTextDidChangeNotification UITextViewTextDidEndEditingNotification` 可以經過監聽 UITextViewTextDidChangeNotification 來對textView停止處置。
### 完成:
#### 添加內部屬性
```
/**
占位字符串
*/
@property (nonatomic, strong) NSString *placeholder;
/**
占位字符串顏色
*/
@property (nonatomic, strong) UIColor *placeholderColor;
/**
字符串長度限制
*/
@property (nonatomic, assign) NSUInteger limitedLength;
/**
能否機制字表情符號的輸出
*/
@property (nonatomic, assign) BOOL emojiDisable;
```
#### 添加辦法
##### 1. 添加占位字符label
```
/**
占位字符串
@param placeholder 占位字符串
*/
- (void)setPlaceholder:(NSString *)placeholder {
if (placeholder) {
_placeholder = placeholder;
self.placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 8, self.frame.size.width - 10, 0)];
self.placeholderLabel.numberOfLines = 0;
self.placeholderLabel.text = placeholder;
self.placeholderLabel.textColor = [UIColor lightGrayColor];
self.placeholderLabel.font = [UIFont systemFontOfSize:13]; // UITextView 默許的字體大小為13
[self adjustLabelFrameHeight:self.placeholderLabel]; // placeholder順應高度
[self addSubview:self.placeholderLabel];
}
}
```
##### 2. 限制表情符號輸出
```
/**
限制表情符號的輸出 需求引入 NSString+EMOEmoji 分類,也可以把辦法復制過去
*/
- (void)disableEmoji {
if([self.text emo_containsEmoji]) {
// emo_disableEmoji 辦法是,在 NSString+EMOEmoji中改寫了一個辦法,詳細看代碼
[self setText:[self.text emo_disableEmoji]];
}
}
```
##### 3. 添加字符長度限制
```
// 給SJTextView添加一個屬性 記載上一次最後顯示在textView中的字符串的外部屬性, 是完成字符串長度限制的關鍵
// 最後一次顯示在textView中的契合限制字符串
@property (nonatomic, strong) NSString *lastText;
// 初始化時,添加監聽
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewEditChanged) name:UITextViewTextDidChangeNotification object:self];
// 監聽辦法完成
- (void)textViewEditChanged {
// ----- placeholderLabel 的顯示與隱藏 -----
if (self.text.length == 0) {
[self.placeholderLabel setHidden:NO];
}
else {
[self.placeholderLabel setHidden:YES];
}
// ----- 制止輸出表情符號 -----
if (self.emojiDisable) {
[self disableEmoji];
}
// ----- 字數限制 -----
// 獲取高亮局部
UITextRange *selectedRange = [self markedTextRange];
UITextPosition *pos = [self positionFromPosition:selectedRange.start offset:0];
// 假如輸出的字還可以變化,就不做限制,self.lastText也不會記載還在變化形態的文字
if (selectedRange && pos) {
return;
}
if (self.text.length > self.lastText.length) {
NSString *neWinputText = [self.text substringFromIndex:self.lastText.length];
NSUInteger canInputLength = self.limitedLength - self.lastText.length;
// 假如長度超出了可輸出長度,復原為上次輸出的字符串,也就是說假如你是復制的一大段文字,長度超越了可輸出的長度,這段文字一個字都不會輸出到TextView中(你要重新編輯好了再重新粘貼,輸出一局部,還是要刪除的)
if (neWinputText.length > canInputLength || canInputLength == 0) {
[self setText:self.lastText];
// 這裡給出提示,輸出超越了限制
NSLog(@"%@",[NSString stringWithFormat:@"字數不能超越%lu個。",(unsigned long)self.limitedLength]);
}
}
self.lastText = self.text;
}
```
【iOS自定義視圖- SJTextView】的相關資料介紹到這裡,希望對您有所幫助!
提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!