iOS 鍵盤輸入型別限制----全類封裝
阿新 • • 發佈:2021-02-07
鍵盤輸入限制區分
根據需求要求,每次對鍵盤的控制都會特別多的要求,對其不進行統一處理,會給我們開發增添很多處理、判斷時間,還需從新每次考慮邏輯來梳理判斷。所以對鍵盤輸入做一個總結。
大致需求有以下幾種類別,後續有新增再更新文件。
1,輸入手機號、驗證碼-----只允許數字輸入,限制字數。
2,輸入密碼----去除空格,漢字
3,暱稱輸入----純漢字輸入
4,金錢輸入----純數字,小數點後兩位
5,禁止表情輸入
面對上面這些需求對textfile進行封裝
1,輸入手機號、驗證碼,主要是限制字數,鍵盤型別改為UIKeyboardTypePhonePad,
` - (BOOL)isIncludeChineseAndSpace:(NSString *)str { for(int i=0; i< [str length];i++) { int a =[str characterAtIndex:i]; if( a >0x4e00&& a <0x9fff) { return YES; } } if ([self containsString:@" "]) { return YES; } return NO;}`
3,暱稱輸入----純漢字輸入,這裡需要判斷是否含有空格,還有就是鍵盤屬於高亮狀態處理。
- (void)textFiledTextChange:(UITextField *)textField{ NSString *string = textField.text; NSLog(@"1.=%@",textField.text); NSArray *currentar = [UITextInputMode activeInputModes];// 鍵盤輸入模式 UITextInputMode *current = [currentar firstObject]; NSString *lang = current.primaryLanguage; if(![lang isEqualToString:@"zh-Hans"]) return; UITextRange *selectedRange = [textField markedTextRange]; //獲取高亮部分 UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; if(position) return;// 有高亮則不處理 // 過濾非漢字 NSMutableString *chinese = string.mutableCopy; for (int i = 0; i<string.length; i++) { int a = [string characterAtIndex:i]; if (a > 0x4e00 && a < 0x9fff) continue; [chinese replaceCharactersInRange:NSMakeRange(i,1) withString:@" "]; } // 除去所有空格 textField.text = [self removeSpaceAndNewline:chinese]; NSLog(@"2.=%@",textField.text); if(self.beforeString && self.beforeString.length > textField.text.length && [chinese containsString:@" "]){ //英文切換過程中處理出現刪減的bug textField.text = self.beforeString; return; } self.beforeString = textField.text; } // 刪除kon - (NSString *)removeSpaceAndNewline:(NSString *)str{ NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""]; temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""]; return temp; }
4,金錢輸入----純數字,小數點後兩位
// 判斷只能輸入小數點
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSMutableString *changedString = [[NSMutableString alloc] initWithString:textField.text];
[changedString replaceCharactersInRange:range withString:string];
return [self isValidAboutInputText:textField shouldChangeCharactersInRange:range replacementString:string decimalNumber:2];
}
// 保留 number 位小數
- (BOOL)isValidAboutInputText:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string decimalNumber:(NSInteger)number {
NSScanner *scanner = [NSScanner scannerWithString:string];
NSCharacterSet *numbers;
NSRange pointRange = [textField.text rangeOfString:@"."];
if ((pointRange.length > 0) && (pointRange.location < range.location || pointRange.location > range.location + range.length)) {
numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
} else {
numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
}
if ([textField.text isEqualToString:@""] && [string isEqualToString:@"."]) {
return NO;
}
short remain = number; // 保留 number位小數
NSString *tempStr = [textField.text stringByAppendingString:string];
NSUInteger strlen = [tempStr length];
if(pointRange.length > 0 && pointRange.location > 0) { // 判斷輸入框內是否含有“.”。
if([string isEqualToString:@"."]) { // 當輸入框內已經含有“.”時,如果再輸入“.”則被視為無效。
return NO;
}
if(strlen > 0 && (strlen - pointRange.location) > remain+1) { // 當輸入框內已經含有“.”,當字串長度減去小數點前面的字串長度大於需要要保留的小數點位數,則視當次輸入無效。
return NO;
}
}
NSRange zeroRange = [textField.text rangeOfString:@"0"];
if(zeroRange.length == 1 && zeroRange.location == 0) { // 判斷輸入框第一個字元是否為“0”
if(![string isEqualToString:@"0"] && ![string isEqualToString:@"."] && [textField.text length] == 1) { // 當輸入框只有一個字元並且字元為“0”時,再輸入不為“0”或者“.”的字元時,則將此輸入替換輸入框的這唯一字元。
textField.text = string;
return NO;
} else {
if(pointRange.length == 0 && pointRange.location > 0) { // 當輸入框第一個字元為“0”時,並且沒有“.”字元時,如果當此輸入的字元為“0”,則視當此輸入無效。
if([string isEqualToString:@"0"]) {
return NO;
}
}
}
}
NSString *buffer;
if (![scanner scanCharactersFromSet:numbers intoString:&buffer] && ([string length] != 0)) {
return NO;
} else {
return YES;
}
}
5,禁止表情輸入
//判斷是否有emoji
-(BOOL)stringContainsEmojiLast:(NSString *)string {
__block BOOL returnValue = NO;
//九宮格 漢字 獲取到的是圈123這樣的
//要可以輸入
if ([string isEqualToString:@"➋"]||[string isEqualToString:@"➌"]||[string isEqualToString:@"➍"]||[string isEqualToString:@"➎"]||[string isEqualToString:@"➏"]||[string isEqualToString:@"➐"]||[string isEqualToString:@"➑"]||[string isEqualToString:@"➒"]) {
return returnValue;
}
[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar high = [substring characterAtIndex: 0];
// Surrogate pair (U+1D000-1F9FF)
if (0xD800 <= high && high <= 0xDBFF) {
const unichar low = [substring characterAtIndex: 1];
const int codepoint = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
if (0x1D000 <= codepoint && codepoint <= 0x1F9FF){
returnValue = YES;
}
// Not surrogate pair (U+2100-27BF)
} else {
if (0x2100 <= high && high <= 0x27BF){
returnValue = YES;
}
}
}];
return returnValue;
}
參考文章:https://blog.csdn.net/kiss20/article/details/107513997
https://www.jianshu.com/p/14a3d0df0c25