Skip to content

Instantly share code, notes, and snippets.

@xuyunan
Last active August 29, 2015 14:04
Show Gist options
  • Save xuyunan/f29e5883126786f9bf2e to your computer and use it in GitHub Desktop.
Save xuyunan/f29e5883126786f9bf2e to your computer and use it in GitHub Desktop.
字符个数限制
// - (void)viewDidAppear
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldTextDidChangeNotification:)
name:UITextFieldTextDidChangeNotification
object:nil];
// - (void)viewDidDisappear
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UITextFieldTextDidChangeNotification
object:nil];
#pragma mark - UITextViewTextDidChangeNotification
- (void)textViewTextDidChangeNotification:(NSNotification *)notification
{
UITextView *textView = (UITextView *)notification.object;
NSString *toBeString = textView.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
// UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!selectedRange) {
int length = [StringUtility calculateTextNumber:toBeString];
if (length > MAX_CONTENT) {
textView.text = [toBeString substringToIndex:[StringUtility calculateSubstringIndex:toBeString
count:MAX_CONTENT]];
}
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{
}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else {
int length = [StringUtility calculateTextNumber:toBeString];
if (length > MAX_CONTENT) {
textView.text = [toBeString substringToIndex:[StringUtility calculateSubstringIndex:toBeString
count:MAX_CONTENT]];
}
}
}
// StringUtility
+ (int)calculateTextNumber:(NSString *)dataString
{
float sum = 0.0;
for(int i=0;i<[dataString length];i++)
{
NSString *character = [dataString substringWithRange:NSMakeRange(i, 1)];
if([character lengthOfBytesUsingEncoding:NSUTF8StringEncoding] == 3)
{
sum += 2;
}
else
sum += 1;
}
return ceil(sum);
}
+ (int)calculateSubstringIndex:(NSString *)text count:(NSUInteger)count
{
float number = 0.0;
for (int index = 0; index < [text length]; index++) {
NSString *character = [text substringWithRange:NSMakeRange(index, 1)];
if ([character lengthOfBytesUsingEncoding:NSUTF8StringEncoding] == 3) {
number += 2;
} else {
number += 1;
}
if (number > count) {
return index;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment