一、UIGestureRecognizer簡單介紹
我們已經(jīng)學(xué)習(xí)了觸摸事件處理,但觸摸事件處理起來很麻煩,每個觸摸事件處理都需要實現(xiàn)3個touches方法絮短,比較繁瑣,實際上我們可以使用更加簡單的觸摸事件處理操作昨忆,那就是 手勢識別UIGestureRecognizer
丁频。
手勢識別操作基類UIGestureRecognizer
不能直接使用,我們常使用的是它的子類邑贴,這些手勢操作類都繼承自UIGestureRecognizer
類
常用手勢識別子類:
- 點按手勢
UITapGestureRecognizer
- 捏合手勢
UIPinchGestureRecognizer
- 拖動手勢
UIPanGestureRecognizer
- 輕掃手勢
UISwipeGestureRecognizer
【4個方向分離】 - 旋轉(zhuǎn)手勢
UIRotationGestureRecognizer
- 長按手勢
UILongPressGestureRecognizer
二席里、UIGestureRecognizer屬性
對象屬性:
@property (nonatomic , readonly) UIGestureRecognizerState state;/*< 手勢狀態(tài) */
@property (nonatomic , getter=isEnabled) BOOL enabled;/*< 手勢是否可用 */
@property (nonatomic , readonly) UIView *view;/*< 觸發(fā)手勢的視圖 */
@property (nonatomic , assign) BOOL delaysTouchesBegan;/*< 手勢識別失敗前不執(zhí)行觸摸開始事件,默認為NO */
手勢識別狀態(tài)state:
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, // 尚未識別是何種手勢操作(但可能已經(jīng)觸發(fā)了觸摸事件)拢驾,默認狀態(tài)
UIGestureRecognizerStateBegan, // 手勢已經(jīng)開始奖磁,此時已經(jīng)被識別,但是這個過程中可能發(fā)生變化繁疤,手勢操作尚未完成
UIGestureRecognizerStateChanged, // 手勢狀態(tài)發(fā)生轉(zhuǎn)變
UIGestureRecognizerStateEnded, // 手勢識別操作完成(此時已經(jīng)松開手指)
UIGestureRecognizerStateCancelled, // 手勢被取消咖为,恢復(fù)到默認狀態(tài)
UIGestureRecognizerStateFailed, // 手勢識別失敗,恢復(fù)到默認狀態(tài)
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢識別完成稠腊,同UIGestureRecognizerStateEnded
};
三、UIGestureRecognizer方法
#pragmX mark 添加觸摸執(zhí)行事件
- (void)addTarget:(id)target action:(SEL)action;
#pragma mark 移除觸摸執(zhí)行事件
- (void)removeTarget:(id)target action:(SEL)action;
#pragma mark 觸摸點的個數(shù)(同時觸摸的手指數(shù))
- (NSUInteger)numberOfTouches;
#pragma mark 在指定視圖中的相對位置
- (CGPoint)locationInView:(UIView*)view;
#pragma mark 觸摸點相對于指定視圖的位置
- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view;
#pragma mark 指定一個手勢需要另一個手勢執(zhí)行失敗才會執(zhí)行
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
四架忌、UIGestureRecognizer使用
# 創(chuàng)建手勢識別器對象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
# 設(shè)置手勢識別器對象的具體屬性
tap.numberOfTapsRequired = 2; // 連續(xù)敲擊2次
tap.numberOfTouchesRequired = 2;// 需要2根手指一起敲擊
# 添加手勢識別器到對應(yīng)的view上
[self.myView addGestureRecognizer:tap];
# 監(jiān)聽手勢的觸發(fā)
[tap addTarget:self action:@selector(tapView:)];
五吞彤、多手勢沖突
在iOS中,如果一個手勢A的識別部分是另一個手勢B的子部分鳖昌,默認情況下A就會先識別备畦,B就無法識別了,
比如拖動手勢A和輕掃手勢B许昨,輕掃手勢只在手勢結(jié)束狀態(tài)才能執(zhí)行懂盐,而拖動手勢在手勢開始的時候執(zhí)行,這兩個手勢一起觸發(fā)糕档,輕掃手勢就成了犧牲品莉恼。
解決手勢沖突,就是利用一個方法:
-(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
該方法指定一個手勢需要另外一個手勢識別失敗才會執(zhí)行
比如解決拖動手勢和輕掃手勢沖突:
// 拖動手勢的執(zhí)行需要右輕掃手勢的失敗為前提
[panGesture requireGestureRecognizerToFail:swipeGestureToRight];
// 拖動手勢的執(zhí)行需要左輕掃手勢的失敗為前提
[panGesture requireGestureRecognizerToFail:swipeGestureToLeft];
六速那、UIGestureRecognizerDelegate代理
代理方法:
#pragma mark 一個控件識別手勢后是否沿著響應(yīng)者鏈條繼續(xù)傳播手勢識別俐银,默認返回NO
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
用該代理方法可以實現(xiàn)兩個不同控件的手勢同時執(zhí)行,需要讓該方法返回YES端仰,手勢識別就能傳遞給不同控件