iOS自訂視圖- SJTextView,iossjtextview

來源:互聯網
上載者:User

iOS自訂視圖- SJTextView,iossjtextview
### 需求:1. textView 需要placeholder用來提示輸入2. textView 要做字數限制 3. textView 禁止Emoji的輸入### 思考:因為需求比較通用,便想通過自訂SJTextView來實現:1. placeholder 通過在textView上添加一個透明的label,輸入開始後隱藏實現。2. 字數限制可以在代理方法中實現,字數達到最大後禁止輸入3. Emoji禁止輸入(這個不常用,因為我們伺服器不接收,於是做了限制輸入),用了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;/** 是否機制字Emoji的輸入 */@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. 限制Emoji輸入```/** 限制Emoji的輸入 需要引入 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]; } // ----- 禁止輸入Emoji ----- 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;}```

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.