開發(fā)過程中不免客戶會提出textfield輸入要大寫顯示的需求,例如車牌號之類的,遇到這種問題我們第一時間想到肯定是在textfield編輯過程中對textfield的文字進(jìn)行操作。
textfield代理方法中有一個shouldChangeCharactersInRange方法,可以監(jiān)測到每次輸入的內(nèi)容,監(jiān)測到之后就可以判斷是否是小寫,并對其進(jìn)行大寫操作,代碼如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (range.length == 1 && string.length == 0) {
return YES;
}
char lowercaseChar = [string characterAtIndex:0];
if (lowercaseChar > 96 && lowercaseChar < 123) {
NSString * uppercaseString = string.uppercaseString;
NSString * frontStr = [textField.text substringToIndex:range.location];
NSString * backStr = [textField.text substringFromIndex:range.location];
textField.text = [NSString stringWithFormat:@"%@%@%@",frontStr,uppercaseString,backStr];
return NO;
}
return YES;
}
后來發(fā)現(xiàn)了BUG:
使用上述方法之后,產(chǎn)生的問題:
1、蘋果原生鍵盤無法輸入漢字,只能輸入字母和數(shù)字(小寫字母可以轉(zhuǎn)換成大寫)
2、三方輸入法可以正常使用(可以輸入漢字,小寫可以轉(zhuǎn)換成大寫)
之后又研究一段時間找到了新的方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ( string.length == 0) {
return YES;
}
UITextInputMode *input = [UIApplication sharedApplication].delegate.window.textInputMode;
NSLog(@"%@",input.primaryLanguage);
if ([input.primaryLanguage isEqualToString:@"zh-Hans"]) {
// 簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫
UITextRange *selectedRange = [textField markedTextRange];
//獲取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計、限制等處理
if (!position) {
// if(textField == self.carNum && self.carNum.text.length > 0){
// // > 0可以輸入一位漢字
// return NO;
// }
}
}else{
// 中文輸入法以外的直接對其統(tǒng)計限制即可,不考慮其他語種情況
// if(textField == self.carNum && textField.text.length > 7){
// return NO;
// }
//小寫變成大寫
char lowercaseChar = [string characterAtIndex:0];
if (lowercaseChar > 96 && lowercaseChar < 123) {
NSString * uppercaseString = string.uppercaseString;
NSString * frontStr = [textField.text substringToIndex:range.location];
NSString * backStr = [textField.text substringFromIndex:range.location];
textField.text = [NSString stringWithFormat:@"%@%@%@",frontStr,uppercaseString,backStr];
return NO;
}
}
return YES;
}
經(jīng)測試,這這個可以解決蘋果原生鍵盤的bug,修改之后,原生鍵盤允許輸入漢字、字母、數(shù)字,字母可轉(zhuǎn)大寫,但是三方輸入法(搜狗輸入法為例)獲取到的primaryLanguage一直都是"zh-Hans",檢測不到用戶開啟英文鍵盤,所以這套代碼不支持搜狗的小寫轉(zhuǎn)大寫。
不定時更新~