iOS TextView限制输入字数且屏蔽Emoji表情符号

一、实现的逻辑很简单且代码量不多,直接贴出源码供方便快速使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@property (nonatomic, strong) UITextView *textView;
@property (nonatomic, strong) UILabel *limitLabel;
     _textView = [[UITextView alloc] initWithFrame:CGRectMake( 5 5 , MAIN_WIDTH- 10 130.3 )];
     _textView.placeHolder = @ "请描述您的问题..." ;
     _textView.returnKeyType = UIReturnKeyDone;
     _textView.delegate = self;
     _textView.textColor = UIColorFromRGB( 0xBEBDBD );
     _textView.font = [UIFont systemFontOfSize: 15 ];
     [self addSubview:_textView];
     
     _limitLabel = [[UILabel alloc] initWithFrame:CGRectMake(MAIN_WIDTH/ 4 * 3 130.3 , MAIN_WIDTH/ 4 - 10 20 )];
     _limitLabel.text = @ "0/500" ;
     _limitLabel.font = [UIFont systemFontOfSize: 12 ];
     _limitLabel.textAlignment = NSTextAlignmentRight;
     _limitLabel.textColor = UIColorFromRGB( 0x999999 );
     _limitLabel.backgroundColor = [UIColor clearColor];

二、实现TextView代理方法

实时监听TextView输入框的return键,当点击return键时结束编辑的实现思路:判断输入的字是否为\n回车,即按下return键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- ( void )textViewDidChange:(UITextView *)textView {
     _limitLabel.text = [NSString stringWithFormat:@ "%ld/500" ,textView.text.length ];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
     NSLog(@ "textLength == %ld" ,textView.text.length);
     if  ([text isEqualToString:@ "\n" ]){  //判断输入的字是否是回车,即按下return
         [self.textView resignFirstResponder];
         return  NO;
     }
     if  ([self stringContainsEmoji:text] == YES) {
         [PubllicMaskViewHelper showTipViewWith:@ "不支持输入Emoji表情符号"  inSuperView:self withDuration: 1 ];
         return  NO;
     }
     if  (textView.text.length + text.length >  500 ) {
         NSString *allText = [NSString stringWithFormat:@ "%@%@" ,textView.text,text];
         textView.text = [allText substringToIndex: 500 ];
         [PubllicMaskViewHelper showTipViewWith:@ "输入不能超过500个字"  inSuperView:self withDuration: 1 ];
         return  NO;
     }
     return  YES;
}

三、过滤所有Emoji表情符号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 过滤所有表情
- (BOOL)stringContainsEmoji:(NSString *)string {
     __block BOOL returnValue = NO;
     [string enumerateSubstringsInRange:NSMakeRange( 0 , [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:
      ^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
          
          const  unichar hs = [substring characterAtIndex: 0 ];
          // surrogate pair
          if  ( 0xd800  <= hs && hs   1 ) {
                  const  unichar ls = [substring characterAtIndex: 1 ];
                  const  int  uc = ((hs -  0xd800 ) *  0x400 ) + (ls -  0xdc00 ) +  0x10000 ;
                  if  ( 0x1d000  <= uc && uc   1 ) {
              const  unichar ls = [substring characterAtIndex: 1 ];
              if  (ls ==  0x20e3 ) {
                  returnValue = YES;
              }
              
          else  {
              // non surrogate
              if  ( 0x2100  <= hs && hs <=  0x27ff ) {
                  returnValue = YES;
              else  if  ( 0x2B05  <= hs && hs <=  0x2b07 ) {
                  returnValue = YES;
              else  if  ( 0x2934  <= hs && hs <=  0x2935 ) {
                  returnValue = YES;
              else  if  ( 0x3297  <= hs && hs <=  0x3299 ) {
                  returnValue = YES;
              else  if  (hs ==  0xa9  || hs ==  0xae  || hs ==  0x303d  || hs ==  0x3030  || hs ==  0x2b55  || hs ==  0x2b1c  || hs ==  0x2b1b  || hs ==  0x2b50 ) {
                  returnValue = YES;
              }
          }
      }];
     
     return  returnValue;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值