因为项目需要对键盘输入内容有所限制,所以弄了个UITextField的父类,做了以下处理。
@property (nonatomic, assign) NSInteger textLocation;//声明一个全局属性,用来记录输入位置
[self addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChanged:(UITextField *)textField {
NSString *primaryLanguage = textField.textInputMode.primaryLanguage; // 键盘输入模式
if ([primaryLanguage isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
//字符处理
if (textField.text.length > self.maxLength) {
NSRange range;
NSUInteger inputLength = 0;
for (int i = 0; i < textField.text.length && inputLength <= self.maxLength; i += range.length) {
range = [textField.text rangeOfComposedCharacterSequenceAtIndex:i];
inputLength += [textField.text substringWithRange:range].length;
if (inputLength > self.maxLength) {
NSString *newText = [textField.text substringWithRange:NSMakeRange(0, range.location)];
textField.text = newText;
}
}
}else {
if (!self.isBeginEditing) {
if (self.textLocation != -1) {
textField.text = [textField.text substringToIndex:self.textLocation];
}
}
}
}
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (self.isRestrictionEmoji) {
if (![self isNineKeyBoard:string]) {
self.isBeginEditing = NO;
if ([NSString stringContainsEmoji:string]) {
self.textLocation = range.location;
}else {
self.textLocation = -1;
}
}
}
return YES;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
self.isBeginEditing = YES;
return YES;
}
-(BOOL)isNineKeyBoard:(NSString *)string {
NSString *other = @"➋➌➍➎➏➐➑➒";
int len = (int)string.length;
for(int i = 0;i < len;i++) {
if(!([other rangeOfString:string].location != NSNotFound)){
return NO;
}
}
return YES;
}
我在开发中,最初发现系统的中文九宫格键盘是无法输入,所以在textFieldShouldBeginEditing
里面添加了一个属性,让这个属性可以来判断键盘第一次输入的内容是否为初始的联想内容,因为最开始的联想内容是不触发shouldChangeCharactersInRange
事件的,但是textFieldDidChanged
方法却做了判断,这可能会让文字内容输入无效。所以添加这么一个属性,来判定是否为最开始的联想输入。目前测试几个键盘交换输入是没有问题的。
如果发现还有什么问题,欢迎私聊于我,如果有更好的办法也希望能写出来,大家互相学习。