代碼邏輯參考自:http://www.reibang.com/p/2d1c06f2dfa4
UITextFiled限制字數(shù)在項目中必不可少舀武,但是由于各種字符的長度不一致(英文字符1個校镐,中文字符2個,emoji4個)導(dǎo)致不能直接用 textField.text.length
進行字數(shù)限制塘偎,而且輸入中文時會有高亮的部分也會計算到length
中,所以這種直接限制長度的方式是不可取的裸诽。
不能直接取length
做為長度限制的依據(jù)滔悉,就需要更好的辦法來解決這個問題。
首先思路是先監(jiān)聽UITextFiled的變化:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledDidChanged:) name:UITextFieldTextDidChangeNotification object:textfield];
然后心俗,需要在監(jiān)聽方法中判斷當前輸入的是不是中文字符傲武,不是中文字符,直接限制長度就行(如果需要限制別的語言文字城榛,就另當別論了)揪利,如果是中文字符,只需判斷當前有沒有高亮的部分(拼音)狠持,高亮部分不需要限制疟位,直接限制非高亮就可以了。
NSString *toBeString = textField.text;
//獲取高亮部分
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
NSString *lang = [textField.textInputMode primaryLanguage];
if ([lang isEqualToString:@"zh-Hans"])// 簡體中文輸入
{
// 沒有高亮選擇的字喘垂,則對已輸入的文字進行字數(shù)統(tǒng)計和限制
if (!position || !selectedRange)
{
if (toBeString.length > self.maxLength)
{
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:self.maxLength];
if (rangeIndex.length == 1)
{
textField.text = [toBeString substringToIndex:self.maxLength];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, self.maxLength)];
textField.text = [toBeString substringWithRange:rangeRange];
}
}
}
}else
{
if (toBeString.length > self.maxLength)
{
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:self.maxLength];
if (rangeIndex.length == 1)
{
textField.text = [toBeString substringToIndex:self.maxLength];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, self.maxLength)];
textField.text = [toBeString substringWithRange:rangeRange];
}
}
}
這樣甜刻,主要邏輯就沒有問題了绍撞,為了使用方便,我將這些代碼封裝到一個TextField的分類得院。
分類代碼