你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS自定義視圖- SJTextView

iOS自定義視圖- SJTextView

編輯:IOS開發綜合

### 需求: 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】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved