iOS 手機螢幕手勢鎖

weixin_34290000發表於2016-10-19

最近一直沒有更新簡書是因為在開發和測試階段,有任務,沒有進行學習,不過在做任務的時候也遇到了一些技術點,在這裡總結一下。

今天看了一個視訊,是關於手機螢幕手勢鎖的(以下簡稱“手勢鎖”)。手機螢幕手勢鎖的應用很廣泛,尤其在支付app和OA類的app中用到的比較多,今天我們就按照視訊上的思路進行一下學習和整理總結。

整體來說該方法在實現手勢鎖的過程中,使用到的知識點可以歸納為以下:button九宮格、touch觸控事件、UIBezierPath貝塞爾曲線、代理等等。其實我們把這幾個知識點拆開來看都不是很難,我們在平時也沒有少用。那麼我們就開始!

這裡說明一下,我這裡沒有完整的程式碼塊,即便有,也只是部分的截圖,大家可以看每張截圖的左邊程式碼的行數,就知道大概的位置了,另外我會在文章最後貼上兩個連結,一個連結是老師的視訊連結,另一個連結是一個程式碼塊的程式碼,具體程式碼的實現和我的這篇文章的程式碼會有些出入,但是實現原理是一樣。

首先傳一個gif動畫,看一下我們最後實現的效果:

1440398-52feb34b25211a50.gif

然後貼上素材,我就是因為找素材找了半天,但是最後找到的素材還不是教程上邊的,湊合著用吧,總之是有點影響效果,但是不影響我們們學習知識的過程。

下邊分別是高亮狀態和normal狀態的素材。和教材的區別就是人家的圖片是圓的,我這裡的是截圖,方形的。


1440398-a7fd68c45b6825d8.png
1440398-62f214de1e368f14.png

我們來看一下我們xcode中的組織結構:

1440398-6e95d015556a1a26.png

這裡我大概說一下實現思路:首先自定一個LockView,然後在controller裡面呼叫該view,AppDelegate跳轉controller進行展示。最主要的程式碼是在自定義的view裡面實現的。

首先第一個知識點:視訊裡的老師還講到了const的作用:定義的變數是隻讀的,不能修改。在其他類中不能宣告相同名字的變數。

這裡我們可以實驗一下:

1440398-398ec56516292454.png

上邊我在自定義的LockView.m中對CGFloat變數btnCount進行了const定義,而上圖中我又在controller裡面對同樣名字的CGFloat變數進行定義,結果是什麼呢?我們Command+B進行編譯,結果報下圖的錯:

1440398-5a9efea3911d3734.png

而我們試圖將controller裡面的名字改成btnCount1,再進行編譯的時候是可以通過的。

通過驗證,我們對const的認識加深了。

下邊我們繼續我們手勢鎖的實現。我們來自定義view裡面.m具體的程式碼實現。

1440398-37c395e04c992ad3.png

視訊裡面是用storyboard實現view和controller的,而我們這裡是純程式碼實現。不管用哪一種,最終的實現效果是一樣的。而上邊的兩個方法,註釋裡面解釋到了上述兩種方法分別會在什麼情況下被呼叫。

也就是說,不管是什麼情況建立的view,總會呼叫[selfaddButtons];這個方法。下邊我們就來看這個方法。

1440398-258a7bc6a5292acf.png

九宮格的實現,相信大家在實際專案中並沒有少寫過吧,這裡不進行詳細介紹了。

1440398-544cc4f50ce6bf68.png

這裡需要說明的有兩點,視訊裡面講的方法個別地方有些實現起來不太對的,那麼我們可以自己略微的修改。上邊綠色的字就是,使用視訊裡面的方法確實是好,看著也很新穎,也合理,之前也沒有用過,可是就是在我們程式碼裡面實現不了,沒辦法,只好再按照forin迴圈遍歷的方法,將button的狀態進行修改了。

下圖是對出現過兩次的程式碼的封裝方法:

1440398-899fcd80fbbc44bd.png

還有就是下邊講到的drawrect方法裡面的貝塞爾曲線設定顏色的順序,我進行了調整,不調整的話,根本賦不上顏色值,幸好我之前看過貝塞爾弧線。僥倖。

1440398-761c185147828610.png
1440398-ebe59553d4c4e2b0.png

至此,自定義view完成,主要是在touch觸控事件裡面完成對九宮格狀態的修改、在drawrect方法裡面對九宮格連線進行了處理。

我們看一下自定義view的.h檔案裡面的程式碼,主要是定義了一個代理,自定義view裡面實現代理是在touchEnd方法裡面,就是觸控結束的時候,然後再controller裡面呼叫設定自定義view的代理self。

1440398-a8cc50b4fc4e1032.png

controller裡面的程式碼:呼叫自定義view和設定alert方便觀察密碼正確與否。

1440398-11cb3765fa1b2c68.png

最後是appDelegate裡面呼叫controller的程式碼:

1440398-1ed90c4090838358.png

至此,手勢鎖就完成了。當然會有如下兩種情況我們沒有辦法模擬:

1、如果輸入錯誤超過n次,會不允許繼續輸入,並且可能會有鎖死的狀態。

2、輸入密碼正確進入app。應該是自定義view銷燬或者頁面push的過程。



參考:手勢鎖視訊

(女老師,感覺不食人間煙火,一點廢話也沒有,一點調侃也沒有,比較生硬,但是聲音還算不難聽)

           手勢鎖程式碼和簡單解釋

(對程式碼和實現手勢鎖的原理進行了簡單的介紹,程式碼和我的程式碼有些區別,但是實現的結果是一樣的)



最後,哪裡不對的地方可以給我留言,我會及時改進的,謝謝大家。

相關文章