• iOS textfield限制长度,中文占2字符,英文占1字符


         之前遇到一种情况,限制textfield长度,并且要适配多语言,做到,例如中文占2字符,英文占1字符,还有考虑其他语言,网上找了很多方法,不太合适,最后结合网上的方案,修改出了还比较适用。

    首先,增加对textfield文字改变的监听,

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:UITextFieldTextDidChangeNotification object:nil];//修改用户名监听,以改变修改按钮的位置

    需要记得在最后要移除监听!

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

    这里写的监听方法是textFiledEditChanged: 文字改变就会调用该方法,思路就是限制长度,超出就截断字符串,所以要考虑的问题是:1、什么时候超出长度?2、在哪截断。还有一个问题就是,在用拼音输入中文的时候,拼音字母还没转换为中文,但是也会引起变化并调用这个方法,如果在这个方法里面获取textfield的文字,会获取到中文和还没转中文的字母和自动加的空格...所以这个问题需要处理,不然会造成例如最多能输入5个中文(10个英文字母),当你输入了4个中文后,你后面只能输入两个字母来拼出一个中文,这是不合理的。解决方法是不统计这些还未转换到字母,(注:还未转换称之为高亮状态)。

    下面解决这些问题:首先,区分中英文的长度(同样适用于多语言),思路是能转ascii码的和不能转的分开统计,那么就要遍历字符串,分开一个一个字符,在遍历的时候可以同时确定要截取字符串的位置,代码如下:

    - (CGFloat)countW:(NSString *)s
    {
        int i;CGFloat n=[s length],l=0,a=0,b=0;
        CGFloat wLen=0;
        unichar c;
        for(i=0;i<n;i++){
            c=[s characterAtIndex:i];//按顺序取出单个字符
            if(isblank(c)){//判断字符串为空或为空格
                b++;
            }else if(isascii(c)){
                a++;
            }else{
                l++;
            }
            wLen=l+(CGFloat)((CGFloat)(a+b)/2.0);
            NSLog(@"wLen--%f",wLen);
            if (wLen>=4.5&&wLen<5.5) {//设定这个范围是因为,当输入了当输入9英文,即4.5,后面还能输1字母,但不能输1中文
                _subLen=l+a+b;//_subLen是要截取字符串的位置
            }
            
        }
        if(a==0 && l==0)
        {
            _subLen=0;
            return 0;//只有isblank
        }
        else{
            
            return wLen;//长度,中文占1,英文等能转ascii的占0.5
        }
    }
    

     监听方法如下:

    -(void)textFiledEditChanged:(NSNotification *)obj{
    
        @try{
            
            UITextField *textField = _userNameTf;
            NSString *str = [[textField text] stringByReplacingOccurrencesOfString:@"?" withString:@""];//输入的字符,包括键盘上高亮的未转成中文的拼音
            NSLog(@"str--%@",str);
            UITextRange *selectedRange = [textField markedTextRange];
            UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];//高亮
            
            if (!position) {//没高亮的文字
                CGFloat ascLen=[self countW:str];//没高亮,获取长度
                NSLog(@"ascLen------------------%f",ascLen);
                    if (ascLen > 5) {
                        NSString *strNew = [NSString stringWithString:str];
                        NSLog(@"strNew--%@",strNew);
                        NSLog(@"_subLen%f",_subLen);
                        if (_subLen==0) {
                            _subLen=strNew.length;
                        }
                        [textField setText:[strNew substringToIndex:_subLen]];
                    }
            }
            else{
    //            NSLog(@"输入的英文还没转化为汉字");//只是高亮,不应该算长度
            }
    
            
        }
        @catch(NSException *exception) {
            NSLog(@"exception:%@", exception);
        }
        @finally {
            
        }
        }
    
  • 相关阅读:
    使用viewpager实现QQ界面切换效果
    实例教程十一:访问通信录中的联系人和添加联系人
    实例教程十四:视频刻录(调用前置摄像头)
    实例教程十二:为应用添加多个Activity与参数传递
    【30篇突击 android】源码统计八
    GIF动画 汇总帖子+实例
    Android ProgressBar 几乎全部的用法
    实例教程十三:拍照
    android NDK 知识汇总
    【原创】oracle中大数据量更新的测试
  • 原文地址:https://www.cnblogs.com/tcan/p/4624551.html
Copyright © 2020-2023  润新知