AJ分享,必须精品

效果:

实现步骤

其实这个实现起来不难

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

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

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

按下:

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

移动

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

抬起

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{ // 取出用户输入的密码
NSMutableString *result = [NSMutableString string];
for (UIButton *btn in self.buttons) {
[result appendFormat:@"%d", btn.tag ];
}
// NSLog(@"result = %@", result);
// 通知代理,告诉代理用户输入的密码
if ([self.delegate respondsToSelector:@selector(lockViewDidClick:andPwd:)]) {
[self.delegate lockViewDidClick:self andPwd:result];
} [self.buttons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)]; // 清空数组
[self.buttons removeAllObjects];
[self setNeedsDisplay]; // 清空currentPoint
self.currentPoint = CGPointZero;
}

画线

- (void)drawRect:(CGRect)rect
{ CGContextRef ctx = UIGraphicsGetCurrentContext(); // 清空上下文
CGContextClearRect(ctx, rect); // 从数组中取出所有的按钮, 连接所有按钮的中点
for (int i = 0; i < self.buttons.count; i++) {
// 取出按钮
UIButton *btn = self.buttons[i];
if (0 == i) {
CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);
}else
{
CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);
}
} // 判断如果当前点是00就不会只
// if (!CGPointEqualToPoint(self.currentPoint, CGPointZero)) {
//
// // 当所有的按钮的中点都连接号之后再连接手指当前的位置
// CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
// } // 判断数组中是否有按钮, 如果有按钮就有起点, 有起点就不会报错
if (self.buttons.count != 0) { CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
} // [[UIColor greenColor] set]; [[UIColor colorWithRed:1/255.0 green:102/255.0 blue:172/255.0 alpha:0.5] set];
CGContextSetLineWidth(ctx, 10);
CGContextSetLineJoin(ctx, kCGLineJoinRound);
CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextStrokePath(ctx);
}

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

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

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

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

/**
* 根据触摸点获取触摸到的按钮
* @return 触摸的按钮
*/
- (UIButton *)getCurrentBtnWithPoint:(CGPoint)point
{
// 2.判断触摸的位置是否在按钮的范围内
for (UIButton *btn in self.subviews) {
//
if (CGRectContainsPoint(btn.frame, point)) {
return btn;
}
}
return nil;
}

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

代理:

#import <UIKit/UIKit.h>

@class NYLockView;

@protocol NYLockViewDelegate <NSObject>

- (void)lockViewDidClick:(NYLockView *)lockView andPwd:(NSString *)pwd;

@end

@interface NYLockView : UIView

@property (nonatomic, weak)IBOutlet id<NYLockViewDelegate> delegate;
@end

取出密码

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

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. Journal of Proteomics Research | 利用混合蛋白质组模型对MBR算法中错误转移鉴定率的评估

    题目:Evaluating False Transfer Rates from the Match-between-Runs Algorithm with a Two-Proteome Model 期 ...

  2. 108. Convert Sorted Array to Binary Search [Python]

    108. Convert Sorted Array to Binary Search Given an array where elements are sorted in ascending ord ...

  3. 强智教务系统验证码识别 Tensorflow CNN

    强智教务系统验证码识别 Tensorflow CNN 一直都是使用API取得数据,但是API提供的数据较少,且为了防止API关闭,先把验证码问题解决 使用Tensorflow训练模型,强智教务系统的验 ...

  4. vnpy源码阅读学习(7):串在一起

    串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...

  5. sql数据库(更新)

    安装postgreSQL,遇到的bug:不要选择默认路径,安装到program files,否则连接数据库的时候会出现问题 如图显示数据库连接成功. 1.创建数据库——执行创建数据库的SQL 语句 C ...

  6. ReentrantLock源码解析——虽众但写

    在看这篇文章时,笔者默认你已经看过AQS或者已经初步的了解AQS的内部过程.   先简单介绍一下ReentantLock,跟synchronized相同,是可重入的重量级锁.但是其用法则相当不同,首先 ...

  7. OpenCV-Python 改变颜色空间 | 十三

    目标 在本教程中,你将学习如何将图像从一个色彩空间转换到另一个,像BGR↔灰色,BGR↔HSV等 除此之外,我们还将创建一个应用程序,以提取视频中的彩色对象 你将学习以下功能:cv.cvtColor, ...

  8. 重磅!刷新两项世界纪录的腾讯优图人脸检测算法DSFD开源了!

    近日,知名开源社区Github上有个名为DSFD(Dual Shot Face Detector)的算法引起了业内关注,它正是来自于腾讯优图.目前,该算法已经被计算机视觉顶级会议CVPR 2019接收 ...

  9. 下面总结一些在HTML中经常使用到的快捷键

    使用的编辑器是VS code: 首先是很基础的: ctrl+s  :保存: ctrl+a  :  全选: ctrl+c , ctrl+c , ctrl+v : 剪切,复制,粘贴: ctrl+z ,ct ...

  10. 5.Metasploit攻击载荷深入理解

    Metasploit 进阶第三讲 深入理解攻击载荷   01 Nesus介绍.安装及使用 Nessus介绍 Nessus是一款著名的漏洞扫描及分析工具,提供完整的漏洞扫描服务,并随时更新漏洞数据库. ...