iOS GestureRecognizer與UIResponder touch事件響應

weixin_34050427發表於2018-07-30

在iOS中UIView是繼承於UIResponder的,而UIResponder是專門用來響應使用者的操作處理各種事件的,包括觸控事件(Touch Events)、運動事件(Motion Events)、遠端控制事件(Remote Control Events,如插入耳機調節音量觸發的事件),而很多我們常用的類也繼承於UIResponder(UIApplication、UIView、UIViewController).

而以下幾個方法

@interface UIResponder : NSObject
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;//觸控螢幕
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;//在螢幕上移動
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;//離開螢幕
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

是響應觸控事件的方法,我們可以利用這幾個方法自定義自己的手勢。當然Apple也為我們提供了幾個基礎的封裝的手勢提供使用(了UIGestureRecognizer手勢識別)

這裡並不深入研究手勢的響應和傳遞,而是研究下幾個基礎的手勢和touchs的關係,這裡主要利用這幾個內建的手勢方法:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];
[self addGestureRecognizer:tap];//點選

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];
[self addGestureRecognizer:pan];//平移,慢速移動

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];//滑動,快速移動
[self addGestureRecognizer:swipe];

UILongPressGestureRecognizer *longG = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];//長按
[self addGestureRecognizer:longG];
2193807-4307becdb0520b7b.png
螢幕快照 2018-07-30 上午9.19.35.png

藍色部分就是需要新增手勢的view,我們分別新增上述的手勢進行測試,同時實現touchs觸控相關方法

2193807-c1e6281f949bf19b.png
螢幕快照 2018-07-30 上午9.39.21.png

首先是UITapGestureRecognizer的方法執行順序

2193807-abcbde7f98c3f3c2.png
螢幕快照 2018-07-30 上午9.21.30.png

很容易理解,因為只是tap單擊事件,所以在檢測到begin touch時手勢事件就開始響應,同時並不會有move動作

然後是UIPanGestureRecognizer

2193807-d9bae1354e3204d4.png
螢幕快照 2018-07-30 上午9.22.03.png

pan手勢是檢測move的,所以在touch move有響應時,pan手勢也進行響應

UISwipeGestureRecognizer

2193807-1089b1303a672514.png
螢幕快照 2018-07-30 上午9.23.14.png

UILongPressGestureRecognizer

2193807-5a3696dcfa8afa52.png
螢幕快照 2018-07-30 上午9.23.34.png

通過以上測試表明系統內建的手勢事件是對UIResponder touch事件的監測封裝,通過不同的計算得出是否觸發了某個手勢,而根據不同的手勢,觸發的時機也不同。通過UIResponder,我們也可以自定義自己的手勢,通過模擬系統手勢很容易就能實現.

相關文章