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 {
        
    }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM