ios手势解锁

  1 #import <UIKit/UIKit.h>
  2 @class NJLockView;
  3
  4 @protocol NJLockViewDelegate <NSObject>
  5
  6 - (void)lockViewDidClick:(NJLockView *)lockView andPwd:(NSString *)pwd;
  7
  8 @end
  9
 10 @interface NJLockView : UIView
 11
 12 @property (nonatomic, weak)IBOutlet id<NJLockViewDelegate> delegate;
 13 @end
 14
 15
 16
 17 @interface NJLockView ()
 18
 19 @property (nonatomic, strong) NSMutableArray *buttons;
 20 /**
 21  *  定义属性,记录用户当前手指的位置(非按钮范围内)
 22  */
 23 @property (nonatomic, assign) CGPoint currentPoint;
 24 @end
 25
 26 @implementation NJLockView
 27
 28
 29 - (NSMutableArray *)buttons
 30 {
 31     if (_buttons == nil) {
 32         _buttons = [NSMutableArray array];
 33     }
 34     return _buttons;
 35 }
 36
 37 // 当视图是通过代码创建出来的就会调用initWithFrame
 38 - (id)initWithFrame:(CGRect)frame
 39 {
 40     self = [super initWithFrame:frame];
 41     if (self) {
 42         // Initialization code
 43 //        NSLog(@"initWithFrame");
 44         [self setup];
 45     }
 46     return self;
 47 }
 48
 49 // 当视图从xib或storyboard中创建出来就会调用
 50 - (id)initWithCoder:(NSCoder *)aDecoder
 51 {
 52     if (self = [super initWithCoder:aDecoder]) {
 53         // 创建9个按钮
 54 //        NSLog(@"initWithCoder");
 55         [self setup];
 56
 57     }
 58     return self;
 59 }
 60
 61 /**
 62  *   创建9个按钮添加到自定view中
 63  */
 64 - (void)setup
 65 {
 66     for (int i = 0; i < 9; i++) {
 67         // 1.创建按钮
 68         UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
 69         // 2.设置按钮的背景图片
 70         [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
 71
 72         [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
 73
 74         // 3.添加按钮到View
 75         [self addSubview:btn];
 76
 77 //        btn.backgroundColor = [UIColor redColor];
 78
 79         // 4.禁止按钮的点击事件(因为我们需要监听触摸事件)
 80         btn.userInteractionEnabled = NO;
 81
 82         // 5.设置按钮的tag作为唯一标识
 83         btn.tag = i;
 84     }
 85 }
 86
 87 - (void)layoutSubviews
 88 {
 89     [super layoutSubviews];
 90     // 设置按钮的frame
 91     for (int i = 0; i < self.subviews.count; i++) {
 92         // 1.取出对应位置的按钮
 93         UIButton *btn = self.subviews[i];
 94
 95         // 2.设置frame
 96         CGFloat btnW = 74;
 97         CGFloat btnH = 74;
 98         // 2.1计算间距
 99         CGFloat margin = (self.frame.size.width - (3 * btnW)) / 4;
100         int col = i % 3; // 列号
101         int row = i / 3; // 行号
102         // 间距 + 列号 * (按钮宽度+ 间距)
103         CGFloat btnX = margin + col * (btnW + margin);
104         CGFloat btnY = margin + row * (btnW + margin);
105
106         btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
107     }
108
109
110 }
111
112 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
113 {
114     // 1.获取按下的点
115    CGPoint startPoint = [self getCurrentTouchPoint:touches];
116
117     // 2.判断触摸的位置是否在按钮的范围内
118     UIButton *btn = [self getCurrentBtnWithPoint:startPoint];
119
120     // 存储按钮
121     if (btn)
122     {
123         // 设置选中状态
124         btn.selected = YES;
125         // 将按钮保存到数组中
126         [self.buttons addObject:btn];
127     }
128
129     btn.selected = YES;
130
131 //    [self setNeedsDisplay];
132
133 }
134
135 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
136 {
137     // 1.获取按下的点
138     CGPoint movePoint = [self getCurrentTouchPoint:touches];
139     // 2.获取触摸的按钮
140     UIButton *btn = [self getCurrentBtnWithPoint:movePoint];
141
142     // 存储按钮
143     if (btn && btn.selected != YES)
144     {
145         // 设置选中状态
146         btn.selected = YES;
147         // 将按钮保存到数组中
148         [self.buttons addObject:btn];
149     }
150     // 记录当前手指移动的位置
151     self.currentPoint = movePoint;
152
153     // 通知view绘制线段
154     [self setNeedsDisplay];
155
156 }
157
158 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
159 {
160
161     // 取出用户输入的密码
162     NSMutableString *result = [NSMutableString string];
163     for (UIButton *btn in self.buttons) {
164         [result appendFormat:@"%d", btn.tag ];
165     }
166 //    NSLog(@"result = %@", result);
167     // 通知代理,告诉代理用户输入的密码
168     if ([self.delegate respondsToSelector:@selector(lockViewDidClick:andPwd:)]) {
169         [self.delegate lockViewDidClick:self andPwd:result];
170     }
171
172     [self.buttons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];
173
174     // 清空数组
175     [self.buttons removeAllObjects];
176     [self setNeedsDisplay];
177
178     // 清空currentPoint
179     self.currentPoint = CGPointZero;
180 }
181
182
183 - (void)drawRect:(CGRect)rect
184 {
185
186     CGContextRef ctx =  UIGraphicsGetCurrentContext();
187
188     // 清空上下文
189     CGContextClearRect(ctx, rect);
190
191     // 从数组中取出所有的按钮, 连接所有按钮的中点
192     for (int  i = 0; i < self.buttons.count; i++) {
193         // 取出按钮
194         UIButton *btn = self.buttons[i];
195         if (0 == i) {
196             CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);
197         }else
198         {
199             CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);
200         }
201     }
202
203     // 判断如果当前点是00就不会只
204 //    if (!CGPointEqualToPoint(self.currentPoint, CGPointZero)) {
205 //
206 //        // 当所有的按钮的中点都连接号之后再连接手指当前的位置
207 //        CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
208 //    }
209
210     // 判断数组中是否有按钮, 如果有按钮就有起点, 有起点就不会报错
211     if (self.buttons.count != 0) {
212
213         CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
214     }
215
216
217 //    [[UIColor greenColor] set];
218
219     [[UIColor colorWithRed:18/255.0 green:102/255.0 blue:72/255.0 alpha:0.5] set];
220     CGContextSetLineWidth(ctx, 10);
221     CGContextSetLineJoin(ctx, kCGLineJoinRound);
222     CGContextSetLineCap(ctx, kCGLineCapRound);
223     CGContextStrokePath(ctx);
224 }
225
226 /**
227  *  根据系统传入的UITouch集合获取当前触摸的点
228  *  @return 当初触摸的点
229  */
230 - (CGPoint)getCurrentTouchPoint:(NSSet *)touches
231 {
232     // 1.获取按下的点
233     UITouch *touch =  [touches anyObject];
234     CGPoint point = [touch locationInView:touch.view];
235     return point;
236 }
237
238 /**
239  *  根据触摸点获取触摸到的按钮
240  *  @return 触摸的按钮
241  */
242 - (UIButton *)getCurrentBtnWithPoint:(CGPoint)point
243 {
244     // 2.判断触摸的位置是否在按钮的范围内
245     for (UIButton *btn in self.subviews) {
246         //
247         if (CGRectContainsPoint(btn.frame, point)) {
248             return btn;
249         }
250     }
251     return nil;
252 }
253 @end
时间: 2024-10-25 21:34:45

ios手势解锁的相关文章

iOS开发UI篇—实现一个简单的手势解锁应用(基本)

iOS开发UI篇—实现一个简单的手势解锁应用(基本) 一.实现效果 实现效果图: 二.手势解锁应用分析 1.监听手指在view上的移动,首先肯定需要自定义一个view,重写touch began,touch move等方法,当手指移动到圈上时,让其变亮.可以通过button按钮来实现. 2.界面搭建 背景图片(给控制器的view添加一个imageview,设置属性背景图片) 九个按钮(把九个按钮作为一个整体,使用一个大的view来管理这些小的view,这些小的view就是9个button.如果使

iOS开发UI篇—实现一个简单的手势解锁应用(完善)

iOS开发UI篇—实现一个简单的手势解锁应用(完善) 一.需要实现的效果 二.应用完善 1.绘制不处于按钮范围内的连线 2.解决bug(完善) bug1:如果在began方法中通知view绘图,那么会产生bug.因为,当前点没有清空,在手指移开之后要清空当前点.可以在绘制前进行判断,如果当前点是(0,0)那么就不划线.或者在began方法中不进行重绘. bug2:无限菊花.自定义view的背景色为默认的(黑色),只要重写了drawrect方法,view默认的背景颜色就是黑色的,因为上下文默认的颜

iOS开发之手势解锁

本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格页面 2.实现按钮被点击及滑动过程中按钮状态的改变 3.实现滑动过程中的连线 4.绘制完毕后判定密码是否正确, 5.密码判定后实现跳转. 下面我们就来用代码实现上述五个过程. 1.加载九宫格界面 1.1九宫格内控件的分布 3*3 ,我们可以自定义view(包含3*3个按钮),添加到viewContr

(素材源码)猫猫学IOS(三十五)UI之Quartz2D仿真支付宝手势解锁_代理获得密码。

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 源码:http://download.csdn.net/detail/u013357243/8669765 效果: 代码: NYLockView.h // // NYLockView.h // 手势解锁 // // Created by apple on 15-5-6. // Copyright (c) 2015年 znyca

【iOS开发之旅】手势解锁

BOERLockView.h // // BOERLockView.h // BoerScore // // Created by ChenQianPing on 16/2/18. // Copyright © 2016年 boer. All rights reserved. // #import <UIKit/UIKit.h> @class BOERLockView; @protocol BOERLockViewDelegate <NSObject> // 结束手势解锁代理事件

iOS绘制手势解锁密码

手势解锁这个功能其实已经用的越来越少了.但是郁闷不知道我公司为什么每次做一个app都要把手势解锁加上.....于是就自己研究了一下手势解锁页面的实现.. 要想实现这个页面,先说说需要掌握哪些: UIPanGestureRecognizer的基本使用 CGRectContainsPoint(<#CGRect rect#>, <#CGPoint point#>) UIBezierPath贝塞尔曲线的绘制 drawRect 和 layoutIfNeeded 知道何时,如何使用 只要掌握上

[iOS UI进阶 - 5.0] 手势解锁Demo

A.需求 1.九宫格手势解锁 2.使用了绘图和手势事件 code source: https://github.com/hellovoidworld/GestureUnlockDemo B.实现 使用按钮来处理每个圆点 使用代码生成按钮 取消按钮点击事件 设置普通状态和选中状态的背景图片 CGRectContainsPoint,移动到按钮范围内改变按钮为选中状态 按钮的连接:使用数组存储被选中的所有按钮,画上连线 已经连线的按钮不需要再连线 触摸结束清空连线和按钮选中状态 移动中也要画出线,最后

Android进阶之自定义View实战(二)九宫格手势解锁实现

一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的基本使用方法,而对用户交互层面仅仅处理了单击事件接口,在实际的业务中,常常涉及到手势操作,本篇博客以九宫格手势解锁View为例,来说明自定义View如何根据需求处理用户的手势操作.虽然九宫格手势解锁自定义View网上资料有很多,实现原理大同小异,但这里我只是根据自己觉得最优的思路来实现它,目的是让更

九点(九宫格)式手势解锁自定义view

周末闲着没事,写了个手势解锁的view,实现起来也蛮快的,半天多一点时间就完事.把源码和资源贴出来,给大家分享,希望对大家有用. 效果,就跟手机上的九点手势解锁一样,上个图吧: 过程嘛感觉确实没啥好讲的了,涉及的知识以前的博客都说过了,无非就是canva,paint,touch事件这些,画画圆圈画画线条,剩下的就是细节处理逻辑了.都在代码里,所以这里就主要是贴资源吧. 这个自定义view就一个类,源码如下: package com.cc.library.view; import android.