本文實例為大家分享了ios手勢密碼解鎖的相關代碼,供大家參考,具體內容如下
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
// // lockview.m // 手勢解鎖 // // created by daniel on 16/4/4. // copyright © 2016年 daniel. all rights reserved. // #import "lockview.h" @interface lockview () /** 保存已選中的按鈕 */ @property(nonatomic, strong) nsmutablearray *selectedbtn; /** 當前觸摸點 */ @property(nonatomic, assign) cgpoint curp; @end @implementation lockview - (nsmutablearray *)selectedbtn { if (_selectedbtn == nil) { _selectedbtn = [nsmutablearray array]; } return _selectedbtn; } - (ibaction)pan:(uipangesturerecognizer *)pan { //獲取當前觸摸點 _curp = [pan locationinview:self]; //判斷觸摸點在不在按鈕上 for (uibutton *btn in self.subviews) { //如果在按鈕上就設置選中狀態 //觸摸點必須在button中心點30范圍內才選中,更精確,體驗更好 cgrect rect = cgrectmake(btn.center.x, btn.center.y, 30, 30); if (cgrectcontainspoint(rect, _curp) && btn.selected == no) { btn.selected = yes; //將這個選中的按鈕保存起來 [self.selectedbtn addobject:btn]; } } //重繪,調用drawrect方法 [self setneedsdisplay]; //手指抬起時 if (pan.state == uigesturerecognizerstateended) { nsmutablestring *strm = [nsmutablestring string]; //如果當前觸摸點不在button上,則手指抬起時,就顯示選中的button以及連線 uibutton *lastbtn = [self.selectedbtn lastobject]; //把最后一個選中按鈕的中心點設置為當前觸摸點,清除最后多出來的一截連線 _curp = lastbtn.center; for (uibutton *btn in self.selectedbtn) { //保存手勢密碼 [strm appendformat:@ "%ld" , btn.tag]; } //strm就是密碼了 nslog(@ "%@" ,strm); //todo:對比之前保存的密碼,如果對了就直接跳轉界面了 //nslog(@"手指抬起"); //這里了執行完之后系統自動調用了重繪方法 //等待2s后清除所有連線,清除button的選中狀態 dispatch_after(dispatch_time(dispatch_time_now, (int64_t)(1.2 * nsec_per_sec)), dispatch_get_main_queue(), ^{ //取消按鈕選中 //[self.selectedbtn makeobjectsperformselector:@selector(setselected:) withobject:no];這句不知道為啥沒有效果,只好用循環了 for (uibutton *btn in self.selectedbtn) { [btn setselected:no]; } //清除連線,清空選中按鈕 [self.selectedbtn removeallobjects]; [self setneedsdisplay]; }); } } - ( void )drawrect:(cgrect)rect { nsinteger count = self.selectedbtn.count; //如果沒有按鈕被選中,就不畫線 if (count == 0) { return ; } uibezierpath *path = [uibezierpath bezierpath]; //把所有點都連完線 for ( int i = 0; i < count; i++) { uibutton * btn = self.selectedbtn[i]; if (i == 0) { //如果是第一個點,就設置為起點 [path movetopoint:btn.center]; } else { //添加連線 [path addlinetopoint: btn.center]; } } //畫最后一個點到手指觸摸點之間的線 [path addlinetopoint:_curp]; [[uicolor greencolor]set]; path.linejoinstyle = kcglinejoinround; path.linewidth = 8; [path stroke]; } - ( void )awakefromnib { //創建9個按鈕 for ( int i = 0; i < 9; i++) { uibutton *btn = [uibutton buttonwithtype:uibuttontypecustom]; //不允許與用戶交互,也就是點擊事件不作處理 btn.userinteractionenabled = no; btn.tag = i; [btn setimage:[uiimage imagenamed:@ "gesture_node_normal" ] forstate:uicontrolstatenormal]; [btn setimage:[uiimage imagenamed:@ "gesture_node_highlighted" ] forstate:uicontrolstateselected]; [self addsubview:btn]; } } - ( void )layoutsubviews { [super layoutsubviews]; //布局子控件 nsinteger count = self.subviews.count; //列數 int cols = 3; cgfloat x = 0; cgfloat y = 0; cgfloat w = 74; cgfloat h = 74; //間距 cgfloat margin = (self.bounds.size.width - w * cols) / (cols + 1); cgfloat col = 0; cgfloat row = 0; for (nsinteger i = 0; i < count; i++) { uibutton *btn = self.subviews[i]; //計算當前button的列行以及xy值 col = i % cols; row = i / cols; x = margin + col * (margin + w); y = row * (margin + w); btn.frame = cgrectmake(x, y, w, h); } } @end |
效果圖:
以上就是本文的全部內容,希望對大家的學習有所幫助。