iOS UITextField輸入的中英文長度限制

背景

在用戶信息填寫等很多場景中腮介,UITextField輸入均有中英文字數(shù)限制望几,常見的比如中文100字、英文200字萤厅。

方案

方案1

常見的方案如下:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.titleField) {
        if (string.length == 0) return YES;

        NSInteger existedLength = textField.text.length;
        NSInteger selectedLength = range.length;
        NSInteger replaceLength = string.length;
        if (existedLength - selectedLength + replaceLength > 20){
            return NO;
        }
    }
}

該方法在每輸入一個字符時都會調用橄抹,在輸入拼音聯(lián)想時,高亮的拼音長度也計算在內惕味,整個字符長度不能超過限制楼誓。比如下圖中,限制為8個中文(16個英文字符)名挥,已輸入的中文“測試測試測試”占用12個字符疟羹,待輸入的“ce s”占用4個字符,至此用戶輸入的長度已達到輸入限制禀倔,導致用戶之后想輸入的拼音都會被截斷榄融,最后的一個字很有可能就打不出來了

方案1 示例圖

方案2

為了避免方案1存在的問題,我們需要在輸入框中存在高亮待輸入文字時救湖,不做字長限制判斷愧杯,輸入確認后,再做判斷鞋既。
1.首先添加監(jiān)聽方法

#pragma mark - 直接添加監(jiān)聽方法
-(void)addTargetMethod{
    [self.textField1 addTarget:self action:@selector(textField1TextChange:) forControlEvents:UIControlEventEditingChanged];
}
-(void)textField1TextChange:(UITextField *)textField{
    NSLog(@"textField1 - 輸入框內容改變,當前內容為: %@",textField.text);
}

2.實現(xiàn)輸入限制方法力九,如果高亮聯(lián)想文字超過限制長度,則截斷高亮文字邑闺,盡可能保留最長的文字跌前,舍棄多余文字。

方案2 聯(lián)想輸入(字符限制16)

方案2 實際輸入(字符限制16)
-(void)textField1TextChange:(UITextField *)textField{
    NSLog(@"textField1 - 輸入框內容改變,當前內容為: %@",textField.text);
    NSString *toBeString = textField.text;
    UITextRange *selectedRange = [textField markedTextRange];
    //獲取高亮部分
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    // 沒有高亮選擇的字陡舅,則對已輸入的文字進行字數(shù)統(tǒng)計和限制
    if (!position) {
        textField.text = [toBeString limitedStringForMaxBytesLength:16];
    }
}

這里需要注意的是抵乓, 表情符號是個坑。在本文的需求設定中,表情符號占用兩個字符長度灾炭,相當于一個中文文字章鲤。

//ascii算一個 中文算2個 emoji算2個(不標準的做法,根據(jù)substringRange可以計算出準確的字節(jié)長度)
- (NSString *)limitedStringForMaxBytesLength:(NSUInteger)maxLength {
    __block NSUInteger asciiLength = 0;
    __block NSUInteger subStringRangeLen = 0;
    [self enumerateSubstringsInRange:NSMakeRange(0, self.length)
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
                              unichar uc = [substring characterAtIndex:0];
                              //英文和漢字length都是1
                              if (substringRange.length == 1) {
                                  //這里還有個坑咆贬, 有些空格是(uc == 0x2006)败徊,不會被 isblank和 isspace命中
                                  //如果不允許出現(xiàn)空格,建議先取出string中的空格
                                  if (isblank(uc) || isspace(uc) || (uc == 0x2006)) {
                                      asciiLength += 1;
                                  } else if (isascii(uc)) {
                                      asciiLength += 1;
                                  } else {
                                      //漢字這里
                                      asciiLength += 2;
                                  }
                              } else {
                                  //表情符號這里
                                  asciiLength += 2;
                              }
                              if (asciiLength <= maxLength) {
                                  subStringRangeLen = substringRange.location + substringRange.length;
                              }
                          }];
    return [self substringWithRange:NSMakeRange(0, subStringRangeLen)];
}
  1. 探索iOS中Emoji表情的編碼與解析
  2. iOS UITextField的小技巧——字數(shù)限制
  3. UITextField 監(jiān)聽數(shù)值變化的三種方法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末掏缎,一起剝皮案震驚了整個濱河市皱蹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眷蜈,老刑警劉巖沪哺,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酌儒,居然都是意外死亡辜妓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門忌怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籍滴,“玉大人,你說我怎么就攤上這事榴啸∧醵瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵鸥印,是天一觀的道長勋功。 經(jīng)常有香客問我,道長库说,這世上最難降的妖魔是什么狂鞋? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮潜的,結果婚禮上骚揍,老公的妹妹穿的比我還像新娘。我一直安慰自己夏块,他們只是感情好疏咐,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脐供,像睡著了一般。 火紅的嫁衣襯著肌膚如雪借跪。 梳的紋絲不亂的頭發(fā)上政己,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼歇由。 笑死卵牍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的沦泌。 我是一名探鬼主播糊昙,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谢谦!你這毒婦竟也來了释牺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤回挽,失蹤者是張志新(化名)和其女友劉穎没咙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體千劈,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡祭刚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了墙牌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涡驮。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喜滨,靈堂內的尸體忽然破棺而出遮怜,到底是詐尸還是另有隱情,我是刑警寧澤鸿市,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布锯梁,位于F島的核電站,受9級特大地震影響焰情,放射性物質發(fā)生泄漏陌凳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一内舟、第九天 我趴在偏房一處隱蔽的房頂上張望合敦。 院中可真熱鬧,春花似錦验游、人聲如沸充岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崔梗。三九已至,卻和暖如春垒在,著一層夾襖步出監(jiān)牢的瞬間蒜魄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谈为,地道東北人旅挤。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像伞鲫,于是被迫代替她去往敵國和親粘茄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359