需求:

  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;
}

最新文章

  1. oracle查看当前用户权限
  2. Netflix Falcor获取JSON数据
  3. Linux学习之七——乱码的解决方案
  4. MIConvexHull
  5. 【Eclipse】安装subclipse的Eclipse插件
  6. ubuntu更换软件源
  7. java中的substring用法
  8. java中String s="abc"及String s=new String("abc")详解
  9. 接收一个IT招聘促销信息,试着想参加,有兴趣的可以携手并进,共同。
  10. 常用 NHibernate.Criterion
  11. HUD1862:EXCEL排序
  12. wemall app商城源码中基于JAVA的Android异步加载图片管理器代码
  13. 搜狗输入法与VS快捷键有冲突_处理办法
  14. Java使用PipedStream管道流通信
  15. nginx 配置身份验证 http_auth_basic_module
  16. 【UOJ349】【WC2018】即时战略 LCT 动态点分治
  17. Unity--- 资源路径问题
  18. 解决SSH Secure Shell 连接Liunx 有乱码情况。
  19. C# 虚方法、override和new
  20. Java页面中EL的${}与<%= request.getParameter%>有什么区别? el 取不到值

热门文章

  1. NodeJs与ActionScript的GET和POST通讯
  2. iOS10适配——错误:Code=3000
  3. POJ 3187 Backward Digit Sums
  4. linux 文件类型识别
  5. UIP源码之ARP过程分析
  6. Lua C Api lua_gettable 、lua_settable 、lua_next 使用详解
  7. 微信小程序之----加载中提示框loading
  8. 2)Java学习笔记:匿名内部类
  9. 分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群(转载)
  10. github上一些酷炫效果