码迷,mamicode.com
首页 > 其他好文 > 详细

关于UITextView的限制字数显示,以及emjor表情占用字节处理,复制粘贴字节处理~优化

时间:2018-09-03 11:14:40      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:复制粘贴   fine   alt   取消   div   convert   max   tle   ascii码   

//限制字数

#define MAX_LIMIT_NUMS 30




1
#pragma mark -- textview的代理事件 2 3 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 4 replacementText:(NSString *)text 5 { 6 UITextRange *selectedRange = [textView markedTextRange]; 7 //获取高亮部分 8 UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0]; 9 //获取高亮部分内容 10 //NSString * selectedtext = [textView textInRange:selectedRange]; 11 12 //如果有高亮且当前字数开始位置小于最大限制时允许输入 13 if (selectedRange && pos) { 14 NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start]; 15 NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end]; 16 NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset); 17 18 if (offsetRange.location < MAX_LIMIT_NUMS) { 19 return YES; 20 } 21 else 22 { 23 return NO; 24 } 25 } 26 27 28 NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text]; 29 30 NSInteger caninputlen = MAX_LIMIT_NUMS - comcatstr.length; 31 32 if (caninputlen >= 0) 33 { 34 return YES; 35 } 36 else 37 { 38 NSInteger len = text.length + caninputlen; 39 //防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错 40 NSRange rg = {0,MAX(len,0)}; 41 42 if (rg.length > 0) 43 { 44 NSString *s = @""; 45 //判断是否只普通的字符或asc码(对于中文和表情返回NO) 46 BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding]; 47 if (asc) { 48 s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错 49 } 50 else 51 { 52 __block NSInteger idx = 0; 53 __block NSString *trimString = @"";//截取出的字串 54 //使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个 55 [text enumerateSubstringsInRange:NSMakeRange(0, [text length]) 56 options:NSStringEnumerationByComposedCharacterSequences 57 usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) { 58 59 if (idx >= rg.length) { 60 *stop = YES; //取出所需要就break,提高效率 61 return ; 62 } 63 64 trimString = [trimString stringByAppendingString:substring]; 65 66 idx++; 67 }]; 68 69 s = trimString; 70 } 71 //rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件) 72 [textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]]; 73 //既然是超出部分截取了,哪一定是最大限制了。---实时获取字节数 74 self.stirngLenghLabel.text = [NSString stringWithFormat:@"%ld/%ld",textView.text.length,(long)MAX_LIMIT_NUMS]; 75 } 76 return NO; 77 } 78 79 } 80 81 - (void)textViewDidChange:(UITextView *)textView 82 { 83 84 self.placeHolder.hidden = YES;//提示文字,可无视
85 UITextRange *selectedRange = [textView markedTextRange]; 86 //获取高亮部分 87 UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0]; 88 89 //如果在变化中是高亮部分在变,就不要计算字符了 90 if (selectedRange && pos) { 91 return; 92 } 93 94 NSString *nsTextContent = textView.text; 95 NSInteger existTextNum = nsTextContent.length; 96 97 if (existTextNum > MAX_LIMIT_NUMS) 98 { 99 //截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断) 100 NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS]; 101 102 [textView setText:s]; 103 } 104 105 //不让显示负数 口口日 106 self.stirngLenghLabel.text = [NSString stringWithFormat:@"%ld/%ld",textView.text.length,(long)MAX_LIMIT_NUMS]; 107 108 // 取消按钮点击权限,并显示提示文字 109 if (textView.text.length == 0) { 110 111 self.placeHolder.hidden = NO; 112 } 113 }

 

技术分享图片

 

关于UITextView的限制字数显示,以及emjor表情占用字节处理,复制粘贴字节处理~优化

标签:复制粘贴   fine   alt   取消   div   convert   max   tle   ascii码   

原文地址:https://www.cnblogs.com/henusyj-1314/p/9577356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!