iOS自定义视图- SJTextView_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > iOS自定义视图- SJTextView

iOS自定义视图- SJTextView

 2017/2/7 5:33:26  Jaesun  程序员俱乐部  我要评论(0)
  • 摘要:###需求:1.textView需要placeholder用来提示输入2.textView要做字数限制3.textView禁止表情符号的输入###思考:因为需求比较通用,便想通过自定义SJTextView来实现:1.placeholder通过在textView上添加一个透明的label,输入开始后隐藏实现。2.字数限制可以在代理方法中实现,字数达到最大后禁止输入3.表情符号禁止输入(这个不常用,因为我们服务器不接收,于是做了限制输入),用了github中[SearchEmojiOnString
  • 标签:view 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; } ```
发表评论
用户名: 匿名