AJ分享,必须精品

效果:

实现步骤

其实这个实现起来不难

第一步先放好主要的UI,一张背景图和一个View
第二部就是把9个button放到view中,设置好按钮的默认和选中图片。
注意:创建时候的模式是UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

  1. /**
  2. * 创建9个按钮添加到自定view中
  3. */
  4. - (void)setup
  5. {
  6. for (int i = 0; i < 9; i++) {
  7. // 1.创建按钮
  8. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  9. // 2.设置按钮的背景图片
  10. [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
  11. [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
  12. // 3.添加按钮到View
  13. [self addSubview:btn];
  14. // btn.backgroundColor = [UIColor redColor];
  15. // 4.禁止按钮的点击事件(因为我们需要监听触摸事件)
  16. btn.userInteractionEnabled = NO;
  17. // 5.设置按钮的tag作为唯一标识
  18. btn.tag = i;
  19. }
  20. }

然后就是监听手指按下,移动,抬起时候的事件了,并且在相应的地方画线。

按下:

  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  2. {
  3. // 1.获取按下的点
  4. CGPoint startPoint = [self getCurrentTouchPoint:touches];
  5. // 2.判断触摸的位置是否在按钮的范围内
  6. UIButton *btn = [self getCurrentBtnWithPoint:startPoint];
  7. // 存储按钮
  8. if (btn)
  9. {
  10. // 设置选中状态
  11. btn.selected = YES;
  12. // 将按钮保存到数组中
  13. [self.buttons addObject:btn];
  14. }
  15. btn.selected = YES;
  16. // [self setNeedsDisplay];
  17. }

移动

  1. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  2. {
  3. // 1.获取按下的点
  4. CGPoint movePoint = [self getCurrentTouchPoint:touches];
  5. // 2.获取触摸的按钮
  6. UIButton *btn = [self getCurrentBtnWithPoint:movePoint];
  7. // 存储按钮
  8. if (btn && btn.selected != YES)
  9. {
  10. // 设置选中状态
  11. btn.selected = YES;
  12. // 将按钮保存到数组中
  13. [self.buttons addObject:btn];
  14. }
  15. // 记录当前手指移动的位置
  16. self.currentPoint = movePoint;
  17. // 通知view绘制线段
  18. [self setNeedsDisplay];
  19. }

抬起

  1. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  2. {
  3. // 取出用户输入的密码
  4. NSMutableString *result = [NSMutableString string];
  5. for (UIButton *btn in self.buttons) {
  6. [result appendFormat:@"%d", btn.tag ];
  7. }
  8. // NSLog(@"result = %@", result);
  9. // 通知代理,告诉代理用户输入的密码
  10. if ([self.delegate respondsToSelector:@selector(lockViewDidClick:andPwd:)]) {
  11. [self.delegate lockViewDidClick:self andPwd:result];
  12. }
  13. [self.buttons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];
  14. // 清空数组
  15. [self.buttons removeAllObjects];
  16. [self setNeedsDisplay];
  17. // 清空currentPoint
  18. self.currentPoint = CGPointZero;
  19. }

画线

  1. - (void)drawRect:(CGRect)rect
  2. {
  3. CGContextRef ctx = UIGraphicsGetCurrentContext();
  4. // 清空上下文
  5. CGContextClearRect(ctx, rect);
  6. // 从数组中取出所有的按钮, 连接所有按钮的中点
  7. for (int i = 0; i < self.buttons.count; i++) {
  8. // 取出按钮
  9. UIButton *btn = self.buttons[i];
  10. if (0 == i) {
  11. CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);
  12. }else
  13. {
  14. CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);
  15. }
  16. }
  17. // 判断如果当前点是00就不会只
  18. // if (!CGPointEqualToPoint(self.currentPoint, CGPointZero)) {
  19. //
  20. // // 当所有的按钮的中点都连接号之后再连接手指当前的位置
  21. // CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
  22. // }
  23. // 判断数组中是否有按钮, 如果有按钮就有起点, 有起点就不会报错
  24. if (self.buttons.count != 0) {
  25. CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
  26. }
  27. // [[UIColor greenColor] set];
  28. [[UIColor colorWithRed:1/255.0 green:102/255.0 blue:172/255.0 alpha:0.5] set];
  29. CGContextSetLineWidth(ctx, 10);
  30. CGContextSetLineJoin(ctx, kCGLineJoinRound);
  31. CGContextSetLineCap(ctx, kCGLineCapRound);
  32. CGContextStrokePath(ctx);
  33. }

还有两个里面抽取出来的代码

根据系统传入的UITouch集合获取当前触摸的点

  1. /**
  2. * 根据系统传入的UITouch集合获取当前触摸的点
  3. * @return 当初触摸的点
  4. */
  5. - (CGPoint)getCurrentTouchPoint:(NSSet *)touches
  6. {
  7. // 1.获取按下的点
  8. UITouch *touch = [touches anyObject];
  9. CGPoint point = [touch locationInView:touch.view];
  10. return point;
  11. }

根据触摸点获取触摸到的按钮

  1. /**
  2. * 根据触摸点获取触摸到的按钮
  3. * @return 触摸的按钮
  4. */
  5. - (UIButton *)getCurrentBtnWithPoint:(CGPoint)point
  6. {
  7. // 2.判断触摸的位置是否在按钮的范围内
  8. for (UIButton *btn in self.subviews) {
  9. //
  10. if (CGRectContainsPoint(btn.frame, point)) {
  11. return btn;
  12. }
  13. }
  14. return nil;
  15. }

还有就是用代理来把设置好的密码传出去。用的是button的tag属性,可以看代码中。

代理:

  1. #import <UIKit/UIKit.h>
  2. @class NYLockView;
  3. @protocol NYLockViewDelegate <NSObject>
  4. - (void)lockViewDidClick:(NYLockView *)lockView andPwd:(NSString *)pwd;
  5. @end
  6. @interface NYLockView : UIView
  7. @property (nonatomic, weak)IBOutlet id<NYLockViewDelegate> delegate;
  8. @end

取出密码

  1. // 取出用户输入的密码
  2. NSMutableString *result = [NSMutableString string];
  3. for (UIButton *btn in self.buttons) {
  4. [result appendFormat:@"%d", btn.tag ];
  5. }
  6. // NSLog(@"result = %@", result);
  7. // 通知代理,告诉代理用户输入的密码
  8. if ([self.delegate respondsToSelector:@selector(lockViewDidClick:andPwd:)]) {
  9. [self.delegate lockViewDidClick:self andPwd:result];
  10. }

AJ学IOS(35)UI之Quartz2D仿真支付宝手势解锁_代理获得密码。的更多相关文章

  1. AJ学IOS(28)UI之Quartz2D简单介绍

    AJ分享,必须精品 iOS开发UI篇—Quartz2D简单介绍 什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : ...

  2. iOS开发UI篇—Quartz2D简单使用(一)

    iOS开发UI篇—Quartz2D简单使用(一) 一.画直线 代码: 1 // 2 // YYlineview.m 3 // 03-画直线 4 // 5 // Created by apple on ...

  3. iOS开发UI之Quartz2D使用(绘制基本图形)

    iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...

  4. iOS开发UI篇—Quartz2D使用(绘制基本图形)

    iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...

  5. iOS开发UI篇—Quartz2D简单介绍

    iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...

  6. iOS开发UI篇—Quartz2D简单使用(一)

    iOS开发UI篇—Quartz2D简单使用(一) 一.画直线 代码: // // YYlineview.m // 03-画直线 // // Created by apple on 14-6-9. // ...

  7. iOS开发UI篇—Quartz2D简单使用(二)

    iOS开发UI篇—Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...

  8. iOS开发UI篇—Quartz2D使用(图形上下文栈)

    iOS开发UI篇—Quartz2D使用(图形上下文栈) 一.qurza2d是怎么将绘图信息和绘图的属性绘制到图形上下文中去的? 说明: 新建一个项目,自定义一个view类和storyboard关联后, ...

  9. iOS开发UI篇—Quartz2D使用(矩阵操作)

    iOS开发UI篇—Quartz2D使用(矩阵操作) 一.关于矩阵操作 1.画一个四边形 通过设置两个端点(长和宽)来完成一个四边形的绘制. 代码: - (void)drawRect:(CGRect)r ...

随机推荐

  1. fastjson JSONObject.toJSONString 出现 $ref: "$."的解决办法(重复引用)

    首先,fastjson作为一款序列化引擎,不可避免的会遇到循环引用的问题,为了避免StackOverflowError异常,fastjson会对引用进行检测. 如果检测到存在重复/循环引用的情况,fa ...

  2. Java8 Stream流

    第三章 Stream流 <Java8 Stream编码实战>的代码全部在https://github.com/yu-linfeng/BlogRepositories/tree/master ...

  3. dfs 例题皇后问题

    题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列  ...

  4. 用python实现矩阵转置,python3 中zip()函数

    前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...

  5. ClickHouse学习系列之一【安装说明】

    背景 最近花了些时间看了下ClickHouse文档,发现它在OLAP方面表现很优异,而且相对也比较轻量和简单,所以准备入门了解下该数据库系统.按照习惯第一步先安装,本文对其用户权限管理方面进行梳理说明 ...

  6. ||,&&短路规则测试

    短路规则:a||b中若a为真,则直接判断整个表达式为真,不再判断b是真或假,    a&&b中若a为假,则直接判断整个表达式为假,不再单独判断b是真或假. 想要测试这个规则的话,可以将 ...

  7. WePY框架 input,checkbox-group,radio-group等change 一般处理方法

    布局搞定了,接下来就是数据处理方面了 form表单中常用标签,绑定change方法: 方法的具体实现 根据打印出来e的结果可以看到,e指代当前标签对象,包含属性方法等 从detail中可以获取多选框选 ...

  8. IOS 常用的宏定义(#define)

    开发中经常用到的常量定义(随时更行): 与UIView相关 //获取View的frame属性 #define GetViewWidth(view) view.frame.size.width #def ...

  9. 通过pip控制台查看已安装第三方库版本及最新版本

    首先执行[pip --help]查看pip命令: 由Commands知:[pip list]命令查看已安装第三方库,另[pip list --outdated]可查看有新版本的第三方库.

  10. [HDU2546]饭卡<dp 01背包>

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 #题目描述: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前, ...