簡(jiǎn)單方法實(shí)現(xiàn)手勢(shì)解鎖

????? 手勢(shì)解鎖這樣的例子網(wǎng)上很多镊绪。對(duì)于新手而言夹攒,如果對(duì)iOS不是很熟悉,做這樣的功能有一種無從下手的感覺邮府,主要是因?yàn)槟承┘?xì)節(jié)看起來不好實(shí)現(xiàn)荧关。我平時(shí)在開發(fā)項(xiàng)目的時(shí)候,一般遵循一個(gè)原則就是褂傀,先詳細(xì)分析忍啤,把整個(gè)邏輯理清楚,先不管看起來多么難仙辟,一個(gè)一個(gè)的細(xì)節(jié)剝離開來同波,然后開始構(gòu)思,最好是越簡(jiǎn)單越好叠国,條理性越清楚越好参萄。我最初學(xué)習(xí)iOS的時(shí)候,當(dāng)時(shí)很想做一個(gè)手勢(shì)解鎖這樣的功能煎饼,但是因?yàn)楫?dāng)時(shí)對(duì)iOS開發(fā)不熟悉讹挎,嘗試了很多復(fù)雜的方式,但是總是不是很完美∵壕粒現(xiàn)在就采用一種簡(jiǎn)單地方式來實(shí)現(xiàn)一個(gè)手勢(shì)解鎖組件筒溃。這是我目前想到的最簡(jiǎn)單的方法。

先看一下具體的效果圖:


下面我先詳細(xì)分析一下沾乘,具體的實(shí)現(xiàn)方式:

1.實(shí)現(xiàn)3行3列排布圓形怜奖,每個(gè)圓之間的間距相等,總體擺勻稱就行了(這里涉及到一些坐標(biāo)運(yùn)算)翅阵。

2.截獲用戶手指在屏幕上滑動(dòng)的事件歪玲,然后根據(jù)滑動(dòng)的具體坐標(biāo)繪制折線(請(qǐng)?jiān)试S我把這些連接起來的線稱為折線)。

3.觸摸手指離開屏幕時(shí)掷匠,清除所有的繪制圖案滥崩。

這里有個(gè)比較棘手的細(xì)節(jié)不好處理,簡(jiǎn)單歸納如下:

如果某個(gè)點(diǎn)已經(jīng)被連過讹语,那么下次再次移動(dòng)到此點(diǎn)上的時(shí)候钙皮,不能再重復(fù)連線。

現(xiàn)在我們開始分析前面所述的三個(gè)步驟如何實(shí)現(xiàn):

1.這里的圓形顽决,我們觀察到短条,有兩種狀態(tài),一種是發(fā)光的才菠,一種是不發(fā)光的茸时。我最初剛開始看到這樣的效果的效果的時(shí)候,我直觀的使用繪圖的方式繪制了9個(gè)圓形赋访,但這樣思考問題的時(shí)候可都,很顯然感覺到異常復(fù)雜缓待,僅僅是處理圓形的兩種狀態(tài)就已經(jīng)很讓人頭痛了。這里汹粤,我們直接創(chuàng)建9個(gè)按鈕命斧,然后設(shè)置不同狀態(tài)的圖片即可田晚。所以我們?cè)诔跏蓟椒ɡ锩鎰?chuàng)建9個(gè)button嘱兼,并添加到父視圖。這里最好對(duì)按鈕做一些封裝贤徒,屏蔽一些細(xì)節(jié)芹壕,讓總體的代碼更加簡(jiǎn)潔。這里我繼承UIButton類接奈,實(shí)現(xiàn)了一個(gè)名為HGCircleView的類踢涌。在后面創(chuàng)建的時(shí)候,我們直接引用這個(gè)類:

\\在initWithFrame方法里面實(shí)現(xiàn)如下的代碼 創(chuàng)建圓形

??? for (NSUInteger i = 0; i < COL_COUNT * ROW_COUNT; ++i) {
??????? HGCircleView* circleView = [HGCircleView circleView];
??????? [self addSubview:circleView];
??? }

2.主要的邏輯就在于第2步了序宦,當(dāng)用戶在屏幕上移動(dòng)觸摸點(diǎn)的時(shí)候睁壁,我們要追蹤到移動(dòng)的軌跡,然后繪制折線互捌。

首先潘明,要追蹤用戶觸摸的軌跡,我們需要重寫三個(gè)方法:

touchesBegan秕噪、touchesMoved钳降、touchesEnded

這三個(gè)方法里面我們可以記錄下用戶最初按壓時(shí)的點(diǎn),移動(dòng)過程中的當(dāng)前點(diǎn)腌巾,以及手指離開時(shí)的點(diǎn)遂填。

在這里,先不要急于繪制移動(dòng)的路徑澈蝙。最終的目的是要把所有觸摸軌跡經(jīng)過的圓形串起來并生成密碼吓坚。所以我在這里用一個(gè)容器,保存了路徑經(jīng)過的所有的circleView灯荧。這里處理一個(gè)細(xì)節(jié)就是凌唬,當(dāng)觸摸到圓形的時(shí)候,我們?cè)O(shè)置圓形的狀態(tài)是selected.并在circleView類的內(nèi)部設(shè)置好selected狀態(tài)下漏麦,顯示發(fā)光效果的圖片客税。

這里順便就可以處理前面提到的那個(gè)比較棘手的細(xì)節(jié),在手勢(shì)經(jīng)過圓形的時(shí)候撕贞,先做一個(gè)檢查更耻,如果發(fā)現(xiàn)圓形已經(jīng)處于selected狀態(tài),那么捏膨,就不在把圓形加入容器秧均,這樣就不會(huì)重復(fù)選擇食侮,很輕松就解決了那個(gè)問題。

接下來目胡,在drawRect方法里面繪制觸摸軌跡锯七,遍歷容器,然后把所有的圓形的center加入U(xiǎn)IBezierPath誉己,然后繪制UIBezierPath即可眉尸。


這樣會(huì)出現(xiàn)一個(gè)新的問題,就是巨双,當(dāng)觸摸移動(dòng)到其他位置(不在圓形上)噪猾,這個(gè)時(shí)候,不能同步繪制筑累,這里我采取的處理方式是袱蜡,用一個(gè)點(diǎn)記錄當(dāng)前用戶手指觸摸移動(dòng)的位置,然后把這個(gè)點(diǎn)作為最后一個(gè)點(diǎn)加入到UIBezierPath中慢宗,為了保證這個(gè)點(diǎn)的可靠性坪蚁,在每次按壓屏幕的時(shí)候?qū)⑦@個(gè)點(diǎn)置為(-10, -10)镜沽,并且在添加到UIBezierPath路徑之前檢查一下敏晤,如果不是(-10, -10)則加入路徑淘邻。


// 1.容器為空茵典,不執(zhí)行任何繪制?

? if (0 == self.circleViews.count) {
??????? return;
??? }
???
??? UIBezierPath* bezierPath = [UIBezierPath new];
??? [bezierPath moveToPoint: [[self.circleViews firstObject] center]];
??? for (NSUInteger i = 1; i < self.circleViews.count; ++i) {
??????? [bezierPath addLineToPoint:[[self.circleViews objectAtIndex:i] center]];
??? }
???
??? if (NO == CGPointEqualToPoint(self.curlastPoint, CGPointMake(-10.0f, -10.0f))) {
??????? [bezierPath addLineToPoint:self.curlastPoint];
??? }
??? // 2.設(shè)置線形
??? bezierPath.lineWidth = 7;
??? bezierPath.lineJoinStyle = kCGLineJoinBevel;
??? [[UIColor colorWithRed:36/255.0 green:200/255.0 blue:260/255.0 alpha:0.5]? set];???????

// 3.繪制路徑?

?? [bezierPath stroke];


3.手指觸摸彈起來的時(shí)候,需要清空繪制宾舅,這個(gè)時(shí)候统阿,這需要清空保存所有被選擇circleView的容器即可。注意在清空之前筹我,應(yīng)該先利用容器內(nèi)的圓形的相關(guān)信息生成密碼扶平。并且把所有圓形的狀態(tài)置為Normal狀態(tài)。

????? 上述這些步驟即可以完成一個(gè)手勢(shì)解鎖功能蔬蕊。好了结澄,說了半天,也沒有用上手勢(shì)識(shí)別器岸夯,僅僅處理了三個(gè)事件麻献。你可以下載詳細(xì)代碼參考。

???? 詳細(xì)代碼實(shí)現(xiàn)github地址:點(diǎn)擊這里下載?






????


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猜扮,一起剝皮案震驚了整個(gè)濱河市勉吻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旅赢,老刑警劉巖齿桃,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惑惶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡短纵,警方通過查閱死者的電腦和手機(jī)带污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來香到,“玉大人鱼冀,你說我怎么就攤上這事⊙剩” “怎么了雷绢?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵泛烙,是天一觀的道長(zhǎng)理卑。 經(jīng)常有香客問我,道長(zhǎng)蔽氨,這世上最難降的妖魔是什么藐唠? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鹉究,結(jié)果婚禮上宇立,老公的妹妹穿的比我還像新娘。我一直安慰自己自赔,他們只是感情好妈嘹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绍妨,像睡著了一般润脸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上他去,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天毙驯,我揣著相機(jī)與錄音,去河邊找鬼灾测。 笑死爆价,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳搪。 我是一名探鬼主播铭段,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秦爆!你這毒婦竟也來了序愚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤鲜结,失蹤者是張志新(化名)和其女友劉穎展运,沒想到半個(gè)月后活逆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拗胜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蔗候,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埂软。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锈遥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勘畔,到底是詐尸還是另有隱情所灸,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布炫七,位于F島的核電站爬立,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏万哪。R本人自食惡果不足惜侠驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奕巍。 院中可真熱鬧吟策,春花似錦、人聲如沸的止。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诅福。三九已至匾委,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間权谁,已是汗流浹背剩檀。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺芽,地道東北人沪猴。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像采章,于是被迫代替她去往敵國(guó)和親运嗜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容