1.手勢識別
UITapGestureRecognizer(敲擊)
UIPinchGestureRecognizer(捏合,用于縮放)
UIPanGestureRecognizer(拖拽)
UISwipeGestureRecognizer(輕掃)
UIRotationGestureRecognizer(旋轉)
UILongPressGestureRecognizer(長按)
每一個特定的手勢必須關聯到view對象中才會有作用,一個view對象可以關聯多個不同的特定手勢,
但是每一個特定的手勢只能與一個view相關聯。當用戶觸摸了view,這個GestureRecognizer就會接受到消息,
它可以響應特定的觸摸事件。
手勢又分為離散手勢和連續手勢。
離散手勢的特點就是一旦識別就無法取消,而且只會調用一次手勢操作事件(初始化手勢時指定的觸發方法)。在六種手勢識別中,只有一種手勢是離散手勢,它就是UITapGestureRecgnier。
連續手勢的特點就是會多次調用手勢操作事件,而且在連續手勢識別后可以取消手勢。從PPT最后一頁的圖可以看出兩者調用操作事件的次數是不同的。其他五種手勢是連續手勢。
delaysTouchesBegan屬性
@property(nonatomic)BOOLdelaysTouchesBegan;
手勢識別失敗前不執行觸摸開始事件,默認為NO;如果為YES,
那么成功識別則不執行觸摸開始事件,失敗則執行觸摸開始事件;如果為NO,則不管成功與否都執行觸摸開始事件;
2.手勢案例:
問題解答
案例中輕掃圖片會引起拖動手勢而不是輕掃手勢。換句話說,兩種手勢發生了沖突。沖突的原因如下:
拖動手勢的操作事件是在手勢的開始狀態(狀態1)識別執行的,而輕掃手勢的操作事件只有在手勢結束狀態(狀態3)才能執行,因此輕掃手勢就作為了犧牲品沒有被正確識別。
如何解決這個沖突呢?
利用- (void)requireGestureRecognizerToFail:(UIGestureRecognizer*)otherGestureRecognizer;方法來完成。這個方法可以指定某個手勢執行的前提是另一個手勢失敗才會識別執行。也就是說如果我們指定拖動手勢的執行前提為輕掃手勢失敗就可以了,這樣一來當我們手指輕輕滑動時系統會優先考慮輕掃手勢,如果最后發現該操作不是輕掃,那么就會執行拖動。
如何讓兩個不同控件的手勢同時執行?
利用代理的-(BOOL)gestureRecognizer:(UIGestureRecognizer*)
gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer方法。
一個控件的手勢識別后是否允許手勢識別繼續向下傳播,默認返回NO;如果為YES,響應者鏈上層對象觸發手勢識別后,如果下層對象也添加了手勢并成功識別也會繼續執行,否則上層對象識別后則不再繼續傳播;