首页 技术 正文
技术 2022年11月15日
0 收藏 860 点赞 2,986 浏览 2815 个字

需求:

  1. textView 需要placeholder用来提示输入
  2. textView 要做字数限制
  3. textView 禁止表情符号的输入

思考:

因为需求比较通用,便想通过自定义SJTextView来实现:

  1. placeholder 通过在textView上添加一个透明的label,输入开始后隐藏实现。
  2. 字数限制可以在代理方法中实现,字数达到最大后禁止输入
  3. 表情符号禁止输入(这个不常用,因为我们服务器不接收,于是做了限制输入),用了github中 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;}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295