博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
键盘字数限制
阅读量:6175 次
发布时间:2019-06-21

本文共 4430 字,大约阅读时间需要 14 分钟。

#pragma mark - UITextView Delegate- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{           UITextRange *selectedRange = [textField markedTextRange];    //获取高亮部分    UITextPosition *pos = [textField positionFromPosition:selectedRange.start offset:0];    //获取高亮部分内容    //NSString * selectedtext = [textView textInRange:selectedRange];        //如果有高亮且当前字数开始位置小于最大限制时允许输入    if (selectedRange && pos) {        NSInteger startOffset = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selectedRange.start];        NSInteger endOffset = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selectedRange.end];        NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);                if (offsetRange.location < MAX_STARWORDS_LENGTH) {            return YES;        }        else        {            return NO;        }    }            NSString *comcatstr = [textField.text stringByReplacingCharactersInRange:range withString:string];        NSInteger caninputlen = MAX_STARWORDS_LENGTH - comcatstr.length;        if (caninputlen >= 0)    {        return YES;    }    else    {        NSInteger len = string.length + caninputlen;        //防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错        NSRange rg = {0,MAX(len,0)};                if (rg.length > 0)        {            NSString *s = @"";            //判断是否只普通的字符或asc码(对于中文和表情返回NO)            BOOL asc = [string canBeConvertedToEncoding:NSASCIIStringEncoding];            if (asc) {                s = [string substringWithRange:rg];//因为是ascii码直接取就可以了不会错            }            else            {                __block NSInteger idx = 0;                __block NSString  *trimString = @"";//截取出的字串                //使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个                [string enumerateSubstringsInRange:NSMakeRange(0, [string length])                                         options:NSStringEnumerationByComposedCharacterSequences                                      usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {                                                                                    if (idx >= rg.length) {                                              *stop = YES; //取出所需要就break,提高效率                                              return ;                                          }                                                                                    trimString = [trimString stringByAppendingString:substring];                                                                                    idx++;                                      }];                                s = trimString;            }            //rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)            [textField setText:[textField.text stringByReplacingCharactersInRange:range withString:s]];            //既然是超出部分截取了,哪一定是最大限制了。//            self.lbNums.text = [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_STARWORDS_LENGTH];        }        return NO;    }}// 计算转换后字符的个数- (NSUInteger) lenghtWithString:(NSString *)string{    NSUInteger len = string.length;    // 汉字字符集    NSString * pattern  = @"[\u4e00-\u9fa5]";    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];    // 计算中文字符的个数    NSInteger numMatch = [regex numberOfMatchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, len)];        return len + numMatch;}#pragma mark - Notification Method-(void)textFieldDidChange:(UITextField *)textField{    UITextRange *selectedRange = [textField markedTextRange];    //获取高亮部分    UITextPosition *pos = [textField positionFromPosition:selectedRange.start offset:0];        //如果在变化中是高亮部分在变,就不要计算字符了    if (selectedRange && pos) {        return;    }        NSString  *nsTextContent = textField.text;    NSInteger existTextNum = nsTextContent.length;        if (existTextNum > MAX_STARWORDS_LENGTH)    {        //截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)        NSString *s = [nsTextContent substringToIndex:MAX_STARWORDS_LENGTH];                [textField setText:s];    }        //不让显示负数 口口日    self.limitLabel.text = [NSString stringWithFormat:@"%lu",MAX(0,MAX_STARWORDS_LENGTH - textField.text.length)];}

 

转载于:https://www.cnblogs.com/keyan1102/p/5154290.html

你可能感兴趣的文章
RabbitMQ学习总结(2)——安装、配置与监控
查看>>
Java基础学习总结(5)——多态
查看>>
shell: demo
查看>>
使用vc+如何添加特殊字符的控件(创世纪篇)
查看>>
Linux下的常用信号
查看>>
3.UIImageView+category
查看>>
2.UIView+category
查看>>
Android ImageLoader使用
查看>>
LDTP
查看>>
StringUtils工具类的常用方法
查看>>
linux下VNC安装与配置
查看>>
URL编码
查看>>
光模块及光纤知识(含分类,常用类型介绍)
查看>>
Apache 单IP多端口设置
查看>>
安装系统前的准备---vmware
查看>>
Tiny并行计算框架之使用介绍
查看>>
Linux od命令
查看>>
一个不错的MySQL集群管理工具
查看>>
mysql-proxy 按表分发查询的lua脚本
查看>>
在wordpress主题下面添加二级菜单
查看>>