在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType類型,它是一個枚舉,作用是可以指定輸入框的類型,以便系統可以分析出用戶的語義.
今天我們就主要研究下:UITextContentTypeTelephoneNumber 手機號碼
效果如圖所示
手機號提示效果圖
1. 首先,實現的第一步,我們需要監聽指定輸入框(UITextFieldDelegate無法完全實現此功能)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:self.txtPhoneNumber];
2.設置輸入框 textContentType = UITextContentTypeTelephoneNumber,keyboardType = UIKeyboardTypeNumbersAndPunctuation,并做好iOS10以下版本的兼容
if (@available(iOS 10.0, *)) {
self.txtPhoneNumber.textContentType = UITextContentTypeTelephoneNumber;
self.txtPhoneNumber.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
}else
{
self.txtPhoneNumber.keyboardType = UIKeyboardTypeNumberPad;
}
3.處理輸入結果
#pragma mark - UITextFieldTextDidChangeNotification
-(void)textFieldEditChanged:(NSNotification *)obj
{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
//兼容鍵盤QuickType Bar以+86開頭的號碼
toBeString = [toBeString stringByReplacingOccurrencesOfString:@"+" withString:@""];
//兼容英文鍵盤前后空格
toBeString = [toBeString stringByReplacingOccurrencesOfString:@" " withString:@""];
if (toBeString.length>0) {
if (![self isNumber:toBeString]) {
//兼容輸入非數字時的處理 ,切去最后一位
toBeString = [toBeString substringToIndex:toBeString.length-1];
}
}
textField.text = toBeString;
//此處為處理鍵盤提示號碼邏輯(如:8618000000000)及(如:+861800000000)
if (@available(iOS 10.0, *)) {
//兼容號碼數字鍵盤
if (toBeString.length==13) {
NSString * startString = [toBeString substringToIndex:3];
if ([startString isEqualToString:@"861"]) {
//當字符串長度為13位,并以861開頭時,截取86,余下則為11位手機號
textField.text = [toBeString substringFromIndex:2];
}
}
}
}
4.結合(UITextFieldDelegate)處理輸入表情特殊字符邏輯
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if([string isEqualToString:@"\n"]) {
[textField resignFirstResponder];
return NO;
}
if (textField == self.txtPhoneNumber) {
if ([self isContainsEmoji:string]) {
//禁輸表情符號
return NO;
}
}
return YES;
}
總結:
此方式可實現獲取鍵盤QuickType Bar所提示手機號碼、屏蔽特殊字符、禁輸Emoji表情,完美實現手機號的輸入和快速鍵盤獲取的功能,歡迎大家指正探討
問題點:
只支持中國大陸的11位號碼,其它國家和地區因國家碼不同號碼長度不同,暫不支持
源碼在此* demo