iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
0
Mobile Development

諸神黃昏下的 iOS 工程師系列 第 13

D13 - 通通給我滑起來,滑動解鎖/操作

  • 分享至 

  • xImage
  •  

讓我們實作一些常見的滑動解鎖功能吧!

? 隕石小故事

在隕石開發期間我們碰到了一個蠻特殊的功能,就是滑動解鎖。使用者必須透過這個滑動的操作來執行一些特定的功能。而至於為什麼要使用滑動的方式呢?我聳了聳肩,我也不知道,但我猜可能是因為比較「潮」吧。

Overview

在 Swift 中我們有許許多多的手勢可以使用,而滑動 Swipe 也算是其中的一個手勢,而某些時候我們需要判斷其滑動的幅度時,那我們該怎麼判斷呢?下面就來帶大家用不同的方式,做不同的滑動解鎖方式。


實作

|使用滑動手勢

首先我們來一個最基本的方法,設置 UISwipeGestureRecognizer,這邊要注意的是一個 swipe 手勢只會支援一個方向,默認為 .right,我們可以透過 .direction 來設置:

接著我們新增一個 handleGesture 的方法,並且透過 gesture 參數來判斷滑動的方向:

讓我們看看效果(這邊忘了模擬器怎麼用滑動手勢,只能用實機錄影 QQ):

如此一來,我們就能在我們想要的元件上加上手勢,並且手勢完成時執行我們想要的操作。


|使用 touch 方式判斷

使用 touch 方式來做滑動解鎖的話,我們可以使用 touchesBegan 配合 touchesEnded 來實作。首先我們透過 touchesBegan 來設置起點,接著在 touchesEnded 設定終點:

接著我們新增一個函數來檢查 startPointendPoint 的距離,最後判斷其滑動的方向:

這邊稍微說明這個 function 的過程:

  1. 判斷 startPoint 與 endPoint 是否有值,否則 return
  2. 宣告常數紀錄 x, y 軸移動距離。
  3. 接著判斷 x, y 的移動距離(絕對值)哪個大,如果為 true 表示為 x 軸移動距離大;反之則為 y 軸移動距離大。
  4. 最後透過正負來判斷是 x 軸移動是左右,又或是 y 軸移動是上下。

畫面基本上就跟上面用 Swipe 相同。但是在這邊我們可以設定一個基本距離,如果滑動的距離沒有大於這個基本距離的話,則不算是一個滑動操作。

所以我們可以在 x, y 移動距離皆小於 100 時,顯示滑動失敗,並且 return 結束執行。接著讓我們看一下畫面。

所以顯示 Swipe failure 時,表示我們滑動的距離過短,操作失敗。


|使用 UISlider 來製作

當然最簡單的方式還是可以用 UISlider 來做最輕鬆啦。我們透過 valueChanged 事件來知道 Slider 的值為多少:

這邊我們判斷 slider 目前的值等於 slider 最大值時,則判斷滑動成功,反之則是失敗,你也可以自由設定滑動值大於多少算是成功。並且我們在滑動結束時將 slider 的值調整至最小值。

接著我們把 Slider 的 Continuous Updates 給取消,讓我們在 Slider 完成拖曳時才調用 valueChanged。(如果沒有取消則會一直調用):

你也可以透過 slider.isContinuous = false 來關閉它。 最後讓我們看一下畫面:

當然如果長這樣你可能會不滿意,所以你可以設置 Slider 的 ThumbImage 以及其他顏色等等,讓他看起來不那麼的原生(業主需求總是無法原生實現啊...),這邊簡單示範一個:


Summary

那麼這次滑動解鎖教學就到這邊結束了,可以根據你的需要使用不同的方式來實作相對應的滑動解鎖功能,如果你有更好的滑動解鎖的做法或方式也歡迎跟我交流分享。


上一篇
# D12 - 躺著玩,坐著玩,趴著玩... 還是不要亂玩好了 QQ
下一篇
D14 - 摸一下,看一眼,讓使用者輕鬆登入
系列文
諸神黃昏下的 iOS 工程師31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言