2014年2月19日 星期三

點按、觸控與手勢

術語











gesture 手勢:

手勢是從我們以一根或多根手指觸碰螢幕到手指離開螢幕之間所發生的一連串事件。
不管時間過了多久,只要手指仍貼著螢幕,就還是在一個手勢動作中(除非因為來電這類的事件而中斷)。

touch 觸碰:

一根或多根手指放在螢幕上,然後拖離螢幕或提起來離開螢幕。
iPad 最多可同時處理 11 個觸控。

tap 點按:

以一根手指碰觸螢幕,然後沒有四處移動便立即將手指離開螢幕。
iOS 會記錄點按的次數,而且能判斷 user 是連點 2 下、3 下或甚至是 20 下。

Pinch 兩指撥動:

將照片放大(兩指外撥)或縮小(兩指內撥)的那種手勢。

gesture recognizer 手勢辨識器:

為一個物件。可幫助我們在使用者於預設手勢時的觸碰、拖曳時辨識出來。

UIGestureRecognizer 其子類別有:

UISwipeGestureRecognizer
UITapGestureRecognizer
UIPinchGestureRecognizer


四種觸控通知 method:

1.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

當 user 第一次接觸螢幕,系統會先尋找此方法回應程式。

我們可以藉由取得 touches 中的物件個數,來判斷目前 user 在螢幕上的手指個數。
在 touches 中每個物件都是一個 UITouch 事件,用來代表一根觸碰著螢幕的手指。

舉例:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSUInteger numTaps = [[touches anyObject] tapCount];
    NSUInteger numTouches = [touches count];
 }

如果 numTaps 的值是 2,代表螢幕很快的被連點兩次。
如果 numTouches 值是 2,代表 user 以兩根手指同時點按螢幕。
如果兩個值皆是 2,代表 user 以兩根手指連按 2 次。

2.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

當 user 的手指在螢幕上移動時,會呼叫的 method。

在一段很長的拖拉中,這個 method 會被呼叫很多次,而每次它被呼叫時,我們都可以獲得一個 touches 的集合、及一個 event。
除了可以從 UITouch 物件找到每根手指的目前位置外,還可以找出觸碰的前一個位置,
也就是上次 touchesMoved:withEvent: 或 touchesBegan:withEvent: 被呼叫時的手指位置。

3.
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

當 user 完成一個手勢時,這個 method 會被呼叫。

4.
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

當 user 正在進行某個手勢,突然發生某事件而中斷他時(ex.來電),此 method 便會被呼叫。

我們可以在此進行任何清理動作,以便重新開始一個新的手勢。
當這個 method 被呼叫時,就不會為目前的手勢動作呼叫 touchesEnded:withEvent: 。

範例:https://github.com/HarrisFu/TouchExplorar

PS. 需要用到手勢的程式時,記得要開啟 View 的 Multiple touch 屬性。