开发需求中有时候我们需要用于安全支付的功能, 需要设置APP钱包的支付密码, 页面是仿照京东的6位输入框的的做法, 效果如下图:

看起来是有由6个UITextField组成, 其实并不是,这只是一个假象.

一、实现思路:

  • 1. 创建一个UITextField,仅仅一个而不是六个! 然后用5根竖线进行分割,这样我们看到的就是一个有6个等同输入框的视图.

  • 2. 创建黑点可以通过创建一个正方形的UIView,设置圆角为宽高的一半,就是一个圆了,使其 frame 显示在中间则黑点居中即可.

  • 3. 当点击输入时候使用shouldChangeCharactersInRange 方法来用来输入的 textfield 做处理, 是否成为第一响应者,用来用户输入, 监听其值的改变.

  • 4. 当密码的长度达到需要的长度时,关闭第一响应者. 这里可以使用 block 来传递 password 的值.

  • 5. 提供一个清除 password 的方法

二、程序实现

先抽出加密支付页面 ZLSafetyPswView, 在.m中主要就是实现页面的效果:

1
2
3
4
5
6
7
8
#define kDotSize CGSizeMake (10, 10) // 密码点的大小
#define kDotCount 6  // 密码个数
#define K_Field_Height self.frame.size.height  // 每一个输入框的高度等于当前view的高度
@interface ZLSafetyPswView () <UITextFieldDelegate>
// 密码输入文本框
@property (nonatomic, strong) UITextField *pswTextField;
// 用于存放加密黑色点
@property (nonatomic, strong) NSMutableArray *dotArr;

创建分割线和黑点.

1
2
3
4
5
6
7
#pragma mark - 懒加载
- (NSMutableArray *)dotArr {
     if  (!_dotArr) {
         _dotArr = [NSMutableArray array];
     }
     return  _dotArr;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- ( void )setupWithPswTextField {
     
     // 每个密码输入框的宽度
     CGFloat width = self.frame.size.width / kDotCount;
     
     // 生成分割线
     for  ( int  i = 0; i < kDotCount - 1; i++) {
         UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMinX(self.pswTextField.frame) + (i + 1) * width, 0, 1, K_Field_Height)];
         lineView.backgroundColor = [UIColor grayColor];
         [self addSubview:lineView];
     }
     
     self.dotArr = [[NSMutableArray alloc] init];
     
     // 生成中间的黑点
     for  ( int  i = 0; i < kDotCount; i++) {
         UIView *dotView = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMinX(self.pswTextField.frame) + (width - kDotCount) / 2 + i * width, CGRectGetMinY(self.pswTextField.frame) + (K_Field_Height - kDotSize.height) / 2, kDotSize.width, kDotSize.height)];
         dotView.backgroundColor = [UIColor blackColor];
         dotView.layer.cornerRadius = kDotSize.width / 2.0f;
         dotView.clipsToBounds = YES;
         dotView.hidden = YES;  // 首先隐藏
         [self addSubview:dotView];
         
         // 把创建的黑色点加入到存放数组中
         [self.dotArr addObject:dotView];
     }
}

创建一个UITextField.切记输入的文字颜色和输入框光标的颜色为透明!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma mark - init
- (UITextField *)pswTextField {
     
     if  (!_pswTextField) {
         _pswTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, K_Field_Height)];
         _pswTextField.backgroundColor = [UIColor clearColor];
         // 输入的文字颜色为无色
         _pswTextField.textColor = [UIColor clearColor];
         // 输入框光标的颜色为无色
         _pswTextField.tintColor = [UIColor clearColor];
         _pswTextField.delegate = self;
         _pswTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
         _pswTextField.keyboardType = UIKeyboardTypeNumberPad;
         _pswTextField.layer.borderColor = [[UIColor grayColor] CGColor];
         _pswTextField.layer.borderWidth = 1;
         [_pswTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
         [self addSubview:_pswTextField];
     }
     return  _pswTextField;
}

文本框内容改变时,用来用户输入, 监听其值的改变.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma mark - 文本框内容改变
/**
  *  重置显示的点
  */
- ( void )textFieldDidChange:(UITextField *)textField {
     
     NSLog(@ "目前输入显示----%@" , textField.text);
     
     for  (UIView *dotView in self.dotArr) {
         dotView.hidden = YES;
     }
     for  ( int  i = 0; i < textField.text.length; i++) {
         ((UIView *)[self.dotArr objectAtIndex:i]).hidden = NO;
     }
     if  (textField.text.length == kDotCount) { 
         NSLog(@ "---输入完毕---" );
         
         [self.pswTextField resignFirstResponder];
     }
     
     // 获取用户输入密码
     !self.passwordDidChangeBlock ? : self.passwordDidChangeBlock(textField.text);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- ( BOOL )textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
     
     NSLog(@ "输入变化%@" , string);
     if ([string isEqualToString:@ "\n" ]) {  // 按回车关闭键盘
         
         [textField resignFirstResponder];
         return  NO;
     else  if (string.length == 0) {  // 判断是不是删除键
         
         return  YES;
     else  if (textField.text.length >= kDotCount) {  // 输入的字符个数大于6,则无法继续输入,返回NO表示禁止输入
         
         NSLog(@ "输入的字符个数大于6,后面禁止输入则忽略输入" );
         return  NO;
     else  {
         
         return  YES;
     }
}

清除密码时收起键盘并将文本输入框值置为空.

1
2
3
4
5
6
7
8
9
#pragma mark - publick method
/**
  *  清除密码
  */
- ( void )clearUpPassword {
     [self.pswTextField resignFirstResponder];
     self.pswTextField.text = nil;
     [self textFieldDidChange:self.pswTextField];
}

接着在当前所需控制器里,创建支付页面并拿到用户输入密码去做支付相关逻辑处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 加密支付页面
     ZLSafetyPswView *pswView = [[ZLSafetyPswView alloc] initWithFrame:CGRectMake(50, 100, self.view.frame.size.width - 100, 45)];
     [self.view addSubview:pswView];
     self.pswView = pswView;
     pswView.passwordDidChangeBlock = ^(NSString *password) {
         NSLog(@ "---用户输入密码为: %@" ,password);
     };
     
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.backgroundColor = [UIColor orangeColor];
     button.frame = CGRectMake(100, 280, self.view.frame.size.width - 200, 50);
     [button addTarget:self action:@selector(clearPsw) forControlEvents:UIControlEventTouchUpInside];
     [button setTitle:@ "清空密码"  forState:UIControlStateNormal];
     [self.view addSubview:button];

方便测试加上清空密码按钮

1
2
3
4
5
6
7
8
// 清空密码
- ( void )clearPsw {
     
     [self.pswView clearUpPassword];
}
- ( void )touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
     [self.view endEditing:YES];
}

三、运行效果与文件截图

1、运行效果:

2、文件截图:

四、其他补充

我这里是做6位支付密码的, 你同样可以修改kDotCount密码个数值,目前也有4位的.

界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行!

如需看详情版,请点击这里下载!

iOS-仿京东6位密码支付输入框相关推荐

  1. 前端案例——1.仿京东显示隐藏密码明文案例。

    <!-- 仿京东显示隐藏密码明文案例 --> <!-- 核心思路:点击眼睛按钮,把密码框改为文本框就可以看见里面的密码. --> <!-- 一个按钮两个状态,点击一次,切 ...

  2. 仿京东显示隐藏密码明文案例(字体图标实现)

    仿京东显示隐藏密码明文案例(字体图标实现) 眼睛使用的是 iconfont 阿里矢量图标库的内容 链接:https://www.iconfont.cn/search/index?代码案例展示: 字体图 ...

  3. js操作元素:改变元素内容有两种方式: interText 和 innerHTML的区别, 常用的元素的属性操作, 仿电脑系统时间问好 ,表单元素的属性操作 ,案例:仿京东显示隐藏密码 ,样式属性操作

    文章目录 操作元素 改变元素内容有两种方式: interText 和 innerHTML的区别 常用的元素的属性操作 案例:仿电脑系统时间问好 表单元素的属性操作 案例:仿京东显示隐藏密码 样式属性操 ...

  4. ios 仿京东商品属性选择界面

    第一次上传的代码,仿京东的,代码粗糙,欢迎交流 https://github.com/wangting8013/-/tree/wangting8013-WTTJD

  5. iOS 仿支付宝密码支付

    代码地址如下: http://www.demodashi.com/demo/11484.html 一.准备工作 xcode 主要实现输入密码的时候不可见 二.程序实现 实现思路怎样 在支付宝输入密码的 ...

  6. js多方框输入密码_js仿支付宝多方框输入支付密码效果

    上次看到别人说写一个类似支付宝支付密码的输入框效果,今天就想自己写了试试看,大体功能是实现了. 已实现部分:1. 焦点会随着输入数值往后推移 2. 如果输入的非0-9,则会出现提示 3. 按Backs ...

  7. pc端自定义密码支付框组件(仿支付宝)

    最近在写几个基于Vue的后台管理系统,期间碰到支付的问题,找了好久都没找着,索性就自己写一个,欢迎指教: 废话不多说,直接上代码: 1.主要用到js的一些基础知识(很底层): 2.全局注册支付框组件( ...

  8. ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果

    ios开发oc高仿京东金融白条额度余额的   ios开发水波纹   ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...

  9. 仿京东实现使用味豆支付

    由于工作上的需求,要做类似于京东支付使用京东的效果.并且能实现京豆联动的效果,最后结合PickerView将三级联动该为一级联动才完美的实现了仿京东味豆支付的效果. 实现的效果如下: 如果有需要源代码 ...

最新文章

  1. java 泛型反射_Java使用反射来获取泛型信息示例
  2. c#设计模式-工厂方法
  3. 如果用神经网络分类处于纠缠态的一对粒子?
  4. NuGet 发布类库,依赖项的问题
  5. EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算
  6. RabbitMQ(2) 一般介绍
  7. 结构体怎么赋值_c语言学习之基础知识点介绍:结构体的介绍
  8. 模型计算量(FLOPs)和参数量(Params)的理解
  9. css文字排列 - 代码篇
  10. 使用java连接ftp服务器_Java如何连接到FTP服务器?
  11. 静能沉淀浮躁,过滤浅薄,调节精神。 静能解读生命的安宁,拥有了然于心的平静。...
  12. 【LOJ】#2532. 「CQOI2018」社交网络
  13. Scala Singleton对象
  14. STM32驱动LCD1602程序(调试已成功)
  15. Matlab抓取网页数据
  16. python PIL生成gif帧率问题
  17. 时寒冰说经济大棋局我们怎么办_女王的棋局:艺术才华是闯天下的最佳武器
  18. Redis部署启动多个端口实例
  19. 如何在Windows 10中打印照片
  20. 好书推荐--《态度》-吴军著

热门文章

  1. java破坏双亲委派_破坏双亲委派模型
  2. linux服务器查看wwn号,linux 下查看wwn号
  3. 青城山 天下幽、都江堰 天下敬
  4. ajax三种传值方式
  5. NC65 多表关联 增加自定义参照并且参照数据要根据选择的财务组织过滤
  6. 08-SVM支持向量机(SVC)
  7. day18_课堂笔记
  8. C语言预测控制算法,基于差分进化算法的计量泵远程流量广义预测控制
  9. CES Asia 2016落下帷幕,VR展台看点大盘点
  10. 用开放和流动反抗熵增,生态建设终极哲学——保险生态建设...