IOS15实现经典登录页面,手机号带格式化功能
核心源码
#import "LJPhoneTextField.h"
// 设置RGB颜色
#define RGB(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
@implementation LJPhoneTextField
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.leftViewMode = UITextFieldViewModeAlways;
self.clearButtonMode = UITextFieldViewModeWhileEditing;
self.backgroundColor = [UIColor whiteColor];
self.textColor = RGB(51,51,51);
[self addTarget:self action:@selector(reformatAsPhoneNumber:) forControlEvents:UIControlEventEditingChanged];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self addTarget:self action:@selector(reformatAsPhoneNumber:) forControlEvents:UIControlEventEditingChanged];
}
return self;
}
-(void)reformatAsPhoneNumber:(UITextField *)textField {
/**
* 判断正确的光标位置
*/
NSUInteger targetCursorPostion = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start];
NSString *phoneNumberWithoutSpaces = [self removeNonDigits:textField.text andPreserveCursorPosition:&targetCursorPostion];
if([phoneNumberWithoutSpaces length]>11) {
/**
* 避免超过11位的输入
*/
[textField setText:_previousTextFieldContent];
textField.selectedTextRange = _previousSelection;
return;
}
NSString *phoneNumberWithSpaces = [self insertSpacesEveryFourDigitsIntoString:phoneNumberWithoutSpaces andPreserveCursorPosition:&targetCursorPostion];
textField.text = phoneNumberWithSpaces;
UITextPosition *targetPostion = [textField positionFromPosition:textField.beginningOfDocument offset:targetCursorPostion];
[textField setSelectedTextRange:[textField textRangeFromPosition:targetPostion toPosition:targetPostion]];
}
/**
* 除去非数字字符,确定光标正确位置
*
* @param string 当前的string
* @param cursorPosition 光标位置
*
* @return 处理过后的string
*/
- (NSString *)removeNonDigits:(NSString *)string andPreserveCursorPosition:(NSUInteger *)cursorPosition {
NSUInteger originalCursorPosition =*cursorPosition;
NSMutableString *digitsOnlyString = [NSMutableString new];
for (NSUInteger i=0; i<string.length; i++) {
unichar characterToAdd = [string characterAtIndex:i];
if(isdigit(characterToAdd)) {
NSString *stringToAdd = [NSString stringWithCharacters:&characterToAdd length:1];
[digitsOnlyString appendString:stringToAdd];
}
else {
if(i<originalCursorPosition) {
(*cursorPosition)--;
}
}
}
return digitsOnlyString;
}
/**
* 将空格插入我们现在的string 中,并确定我们光标的正确位置,防止在空格中
*
* @param string 当前的string
* @param cursorPosition 光标位置
*
* @return 处理后有空格的string
*/
- (NSString *)insertSpacesEveryFourDigitsIntoString:(NSString *)string andPreserveCursorPosition:(NSUInteger *)cursorPosition{
NSMutableString *stringWithAddedSpaces = [NSMutableString new];
NSUInteger cursorPositionInSpacelessString = *cursorPosition;
for (NSUInteger i=0; i<string.length; i++) {
if(i>0)
{
if(i==3 || i==7) {
[stringWithAddedSpaces appendString:@" "];
if(i<cursorPositionInSpacelessString) {
(*cursorPosition)++;
}
}
}
unichar characterToAdd = [string characterAtIndex:i];
NSString *stringToAdd = [NSString stringWithCharacters:&characterToAdd length:1];
[stringWithAddedSpaces appendString:stringToAdd];
}
return stringWithAddedSpaces;
}
#pragma mark - UITextFieldDelegate
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
_previousSelection = textField.selectedTextRange;
_previousTextFieldContent = textField.text;
if(range.location==0) {
if(string.integerValue >1)
{
return NO;
}
}
return YES;
}
@end
开源地址
https://gitee.com/johnson__save_admin/ljphone-text-field
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术