iOS限制文字长度(支持中文)

首先,今天是五一,大家节日快乐4fff9fed44c2ceac44c6f啦啦啦啦,可以肆无忌惮的奔弛啦,该浪的浪,该约的约,该xx的xx

嗯,废话结束,话说一种很常见的问题,就是限制文字长度,几乎所有APP都会有这个需求,但是呢,当碰到中文输入不知道大家是否碰到过问题,就是拼音也在长度计算之内!!!!简直不能忍!

so,这种五一的时候,给大家一点奉献,奉献完了我就出门浪咯~~

首先,问题分析,实际上的情况就是,中文输入的时候,拼音是在输入框内,然后是选中状态的,就比如这样:QQ20150501-1@2x,就是说拼音是选中状态的,那么可以根据UITextInput 协议计算出选中文字的UITextRange,然后根据UITextRange计算NSRange,就能知道非选中状态下的中文文字字符串了,当然,以上问题在iOS7下没问题!!

OK,上代码:

#import "ViewController.h"
#import "UITextRange+ELVSubject.h"

//是否iOS7/iOS8
#define IOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]&gt;=7&amp;&amp;[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]<8)
#define IOS8 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=8)

@interface ViewController ()<UITextFieldDelegate>;

@end

@implementation ViewController

- (void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkTextFieldTextLength:) name:UITextFieldTextDidChangeNotification object:nil];
}

- (void)checkTextFieldTextLength:(NSNotification *)noti{
    UITextField *textField = noti.object;
    NSString *text = textField.text;
    //待选文字外的内容
    NSString *tmpStr;
    if (IOS8) {
        //记录中文待选文字记录
        UITextRange *markedTextRange = textField.markedTextRange;
        //待选文字range
        NSRange markedRange = [markedTextRange rangeValueWithInputValue:textField];
        tmpStr = [NSString stringWithFormat:@"%@%@",[text substringToIndex:markedRange.location],[text substringFromIndex:markedRange.location+markedRange.length]];
    }
    else if (IOS7){
        tmpStr = text;
    }
    //修改话题样式
    if (tmpStr.length&gt;10) {
        [textField deleteBackward];
    }
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

#import "UITextRange+ELVSubject.h"

@implementation UITextRange (ELVSubject)

/**
 *  UITextRange 转换成 NSRange
 *
 *  @param input 输入视图
 *
 *  @return NSRange值
 */
- (NSRange)rangeValueWithInputValue:(id<UITextInput>)input
{
    UITextPosition* beginning = input.beginningOfDocument;
    UITextPosition* selectionStart = self.start;
    UITextPosition* selectionEnd = self.end;
    NSInteger location = [input offsetFromPosition:beginning toPosition:selectionStart];
    NSInteger length = [input offsetFromPosition:selectionStart toPosition:selectionEnd];
    return NSMakeRange(location, length);
}

@end

以上。

五一快乐!