首先,今天是五一,大家节日快乐
啦啦啦啦,可以肆无忌惮的奔弛啦,该浪的浪,该约的约,该xx的xx
嗯,废话结束,话说一种很常见的问题,就是限制文字长度,几乎所有APP都会有这个需求,但是呢,当碰到中文输入不知道大家是否碰到过问题,就是拼音也在长度计算之内!!!!简直不能忍!
so,这种五一的时候,给大家一点奉献,奉献完了我就出门浪咯~~
首先,问题分析,实际上的情况就是,中文输入的时候,拼音是在输入框内,然后是选中状态的,就比如这样:
,就是说拼音是选中状态的,那么可以根据UITextInput 协议计算出选中文字的UITextRange,然后根据UITextRange计算NSRange,就能知道非选中状态下的中文文字字符串了,当然,以上问题在iOS7下没问题!!
OK,上代码:
#import "ViewController.h"
#import "UITextRange+ELVSubject.h"
//是否iOS7/iOS8
#define IOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=7&&[[[[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>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
以上。
五一快乐!
