键盘字数限制

#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)];
}
时间: 2024-10-08 19:13:51

键盘字数限制的相关文章

关于键盘输入中文控制字数 (找了很久,最好的写法)真是完美

- (void)textchanged:(NSNotification *)noti{ UITextField *textfield = (UITextField *)noti.object; NSInteger kMaxLength = 40; if (textfield.tag == kSuggestAdressFieldTag) { kMaxLength = 20; } NSString *toBeString =textfield.text; NSString *lang = [[UIT

巧用 即刻搜索事件 input propertychange 监听输入框字数

实时监听输入框的字数,大于200时,不再输入. 即时搜索: propertychange(ie)和input事件(常用) input是标准的浏览器事件,一般应用于input元素,当input的value发生变化就会发生,无论是键盘输入还是鼠标黏贴的改变都能及时监听到变化 propertychange,只要当前对象属性发生改变.(IE专属的) <div class="container js_container"> <div class="weui-cells

详释(常见UITextView 输入之字数限制)之一---固定长度

好久没有写文章了,今天上来写写,发现增多了markDown编辑器.挺不错,后续研究一下,今天暂写文章先.好了,不废话. 如题,相信大家看到这个标题都不想看文章了,这有什么好说的,网上一搜一大把.好吧,自认为是一搜一大把的跳过,有兴趣的就看完...... 对于限制UITextView输入的字符数.相信大家在网上见得最多的是实现UITextViewDelegate - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSR

OC中限制UITextView的最大字数的实现

一.属性 //自定义的textview @property (weak, nonatomic) IBOutlet UITextView *textview; //添加一个bool类型的属性 @property (nonatomic, assign) BOOL isNameTextFieldEnbable; 二.监听通知.并初始化BOOL值 //UITextView的监听方法 [[NSNotificationCenter defaultCenter] addObserver:self select

实现textarea限制输入字数(包含中文只能输入10个,全ASCII码能够输入20个)

textarea称文本域,又称文本区,即有滚动条的多行文本输入控件,在网页的提交表单中经常用到.与单行文本框text控件不同,它不能通过maxlength属性来限制字数,为此必须寻求其他方法来加以限制以达到预设的需求. 通常的做法就是使用#脚本语言来实现对textarea文本域的字数输入限制,简单而实用.假设我们有一个id为 txta1 的textarea文本区,我们可以通过以下代码限制它的键盘输入字数为10个字(汉字或其他小角字符): <script language="#"

angularjs textarea 剩余字数统计

写页面的过程中用到了textarea的文本域,就突然想起他也可以加上剩余字数统计的这个功能. 第一个思路: 根据键盘按键按下去触发一个方法计数: <textarea cols="50" rows="10" maxlength="100" title="只能输入100个字" ng-model="text" ng-change="tolCount()"></textarea

UITextField限制字数方法

? ? ? ? 今天被这个问题坑了一天.在UITextField的delegate方法里,各种判断.结果还是有bug.最明显的是中文输入模式下,联想输入可以突破字数限制. 今天找到一种方法,注册观察者UITextFieldTextDidChangeNotification.如果UITextField内容改变,就计算字数并判断. 分三步走: 第一步:注册观察者. [[NSNotificationCenter defaultCenter] addObserver:self selector:@sel

uitextField限制字数方法和抖动效果

这个方法也是在网上找的.具体如下: .h文件 #import <UIKit/UIKit.h> @interface UITextField (LimitLength) /** * 使用时只要调用此方法,加上一个长度(int),就可以实现了字数限制,汉字不可以 * * @param length */ - (void)limitTextLength:(int)length; /** * uitextField 抖动效果 */ - (void)shake; @end .m文件 #import &q

统计字数oninput?keyup?onchange?

在开发中,经常会遇到实时统计文本框或文本域中输入字符的个数,超过规定位数后禁止再输入. <div> <textarea name="content" id="content" cols="30" rows="10"></textarea> <p>剩余输入字符个数:<span>140</span></p> </div> // 字符输入