iOS開(kāi)發(fā)之手勢(shì)識(shí)別
一、UIGestureRecognizer簡(jiǎn)單介紹
我們已經(jīng)學(xué)習(xí)了觸摸事件處理,但觸摸事件處理起來(lái)很麻煩,每個(gè)觸摸事件處理都需要實(shí)現(xiàn)3個(gè)touches方法,比較繁瑣,實(shí)際上我們可以使用更加簡(jiǎn)單的觸摸事件處理操作,那就是 手勢(shì)識(shí)別UIGestureRecognizer 。
手勢(shì)識(shí)別操作基類(lèi)UIGestureRecognizer不能直接使用,我們常使用的是它的子類(lèi),這些手勢(shì)操作類(lèi)都繼承自UIGestureRecognizer類(lèi)
常用手勢(shì)識(shí)別子類(lèi):
點(diǎn)按手勢(shì) UITapGestureRecognizer
捏合手勢(shì) UIPinchGestureRecognizer
拖動(dòng)手勢(shì) UIPanGestureRecognizer
輕掃手勢(shì) UISwipeGestureRecognizer【4個(gè)方向分離】
旋轉(zhuǎn)手勢(shì) UIRotationGestureRecognizer
長(zhǎng)按手勢(shì) UILongPressGestureRecognizer
二、UIGestureRecognizer屬性
對(duì)象屬性:
@property (nonatomic , readonly) UIGestureRecognizerState state;/*< 手勢(shì)狀態(tài) */
@property (nonatomic , getter=isEnabled) BOOL enabled;/*< 手勢(shì)是否可用 */
@property (nonatomic , readonly) UIView *view;/*< 觸發(fā)手勢(shì)的視圖 */
@property (nonatomic , assign) BOOL delaysTouchesBegan;/*< 手勢(shì)識(shí)別失敗前不執(zhí)行觸摸開(kāi)始事件,默認(rèn)為NO */
手勢(shì)識(shí)別狀態(tài)state:
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, // 尚未識(shí)別是何種手勢(shì)操作(但可能已經(jīng)觸發(fā)了觸摸事件),默認(rèn)狀態(tài)
UIGestureRecognizerStateBegan, // 手勢(shì)已經(jīng)開(kāi)始,此時(shí)已經(jīng)被識(shí)別,但是這個(gè)過(guò)程中可能發(fā)生變化,手勢(shì)操作尚未完成
UIGestureRecognizerStateChanged, // 手勢(shì)狀態(tài)發(fā)生轉(zhuǎn)變
UIGestureRecognizerStateEnded, // 手勢(shì)識(shí)別操作完成(此時(shí)已經(jīng)松開(kāi)手指)
UIGestureRecognizerStateCancelled, // 手勢(shì)被取消,恢復(fù)到默認(rèn)狀態(tài)
UIGestureRecognizerStateFailed, // 手勢(shì)識(shí)別失敗,恢復(fù)到默認(rèn)狀態(tài)
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢(shì)識(shí)別完成,同UIGestureRecognizerStateEnded
};
左圖為 短手勢(shì) 的狀態(tài)轉(zhuǎn)變,右圖為 長(zhǎng)手勢(shì) 的狀態(tài)轉(zhuǎn)變

三、UIGestureRecognizer方法
#pragmX mark 添加觸摸執(zhí)行事件
- (void)addTarget:(id)target action:(SEL)action;
#pragma mark 移除觸摸執(zhí)行事件
- (void)removeTarget:(id)target action:(SEL)action;
#pragma mark 觸摸點(diǎn)的個(gè)數(shù)(同時(shí)觸摸的手指數(shù))
- (NSUInteger)numberOfTouches;
#pragma mark 在指定視圖中的相對(duì)位置
- (CGPoint)locationInView:(UIView*)view;
#pragma mark 觸摸點(diǎn)相對(duì)于指定視圖的位置
- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view;
#pragma mark 指定一個(gè)手勢(shì)需要另一個(gè)手勢(shì)執(zhí)行失敗才會(huì)執(zhí)行
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
四、UIGestureRecognizer使用
# 創(chuàng)建手勢(shì)識(shí)別器對(duì)象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
# 設(shè)置手勢(shì)識(shí)別器對(duì)象的具體屬性
tap.numberOfTapsRequired = 2; // 連續(xù)敲擊2次
tap.numberOfTouchesRequired = 2;// 需要2根手指一起敲擊
# 添加手勢(shì)識(shí)別器到對(duì)應(yīng)的view上
[self.myView addGestureRecognizer:tap];
# 監(jiān)聽(tīng)手勢(shì)的觸發(fā)
[tap addTarget:self action:@selector(tapView:)];
五、多手勢(shì)沖突
在iOS中,如果一個(gè)手勢(shì)A的識(shí)別部分是另一個(gè)手勢(shì)B的子部分,默認(rèn)情況下A就會(huì)先識(shí)別,B就無(wú)法識(shí)別了,
比如拖動(dòng)手勢(shì)A和輕掃手勢(shì)B,輕掃手勢(shì)只在手勢(shì)結(jié)束狀態(tài)才能執(zhí)行,而拖動(dòng)手勢(shì)在手勢(shì)開(kāi)始的時(shí)候執(zhí)行,這兩個(gè)手勢(shì)一起觸發(fā),輕掃手勢(shì)就成了犧牲品。
解決手勢(shì)沖突,就是利用一個(gè)方法:
-(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
該方法指定一個(gè)手勢(shì)需要另外一個(gè)手勢(shì)識(shí)別失敗才會(huì)執(zhí)行
比如解決拖動(dòng)手勢(shì)和輕掃手勢(shì)沖突:
// 拖動(dòng)手勢(shì)的執(zhí)行需要右輕掃手勢(shì)的失敗為前提
[panGesture requireGestureRecognizerToFail:swipeGestureToRight];
// 拖動(dòng)手勢(shì)的執(zhí)行需要左輕掃手勢(shì)的失敗為前提
[panGesture requireGestureRecognizerToFail:swipeGestureToLeft];
六、UIGestureRecognizerDelegate代理
代理方法:
#pragma mark 一個(gè)控件識(shí)別手勢(shì)后是否沿著響應(yīng)者鏈條繼續(xù)傳播手勢(shì)識(shí)別,默認(rèn)返回NO
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
用該代理方法可以實(shí)現(xiàn)兩個(gè)不同控件的手勢(shì)同時(shí)執(zhí)行,需要讓該方法返回YES,手勢(shì)識(shí)別就能傳遞給不同控件
- IOS手勢(shì)操作(拖動(dòng)、捏合、旋轉(zhuǎn)、點(diǎn)按、長(zhǎng)按、輕掃、自定義)
- iOS開(kāi)發(fā)中的幾個(gè)手勢(shì)操作實(shí)例分享
- iOS實(shí)現(xiàn)手勢(shì)解鎖操作
- 使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖實(shí)例詳解
- 基于JS實(shí)現(xiàn)Android,iOS一個(gè)手勢(shì)動(dòng)畫(huà)效果
- iOS仿郵箱大師的九宮格手勢(shì)密碼解鎖
- iOS開(kāi)發(fā)之觸摸事件以及手勢(shì)
- iOS手勢(shì)密碼的實(shí)現(xiàn)方法
- iOS輕點(diǎn)、觸摸和手勢(shì)代碼開(kāi)發(fā)
- iOS手勢(shì)的實(shí)現(xiàn)方法
相關(guān)文章
IOS 文件讀寫(xiě)操作詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了IOS 文件讀寫(xiě)操作詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
詳解iOS應(yīng)用中自定義UIBarButtonItem導(dǎo)航按鈕的創(chuàng)建方法
這篇文章主要介紹了iOS應(yīng)用中自定義UIBarButtonItem導(dǎo)航按鈕的創(chuàng)建方法,文中舉了一個(gè)自定義圖片的UIBarButtonItem實(shí)例,比較具有代表性,需要的朋友可以參考下2016-04-04
iOS開(kāi)發(fā)之(APNS)遠(yuǎn)程推送實(shí)現(xiàn)代碼 附證書(shū)與真機(jī)調(diào)試
這篇文章主要為大家詳細(xì)介紹了iOS開(kāi)發(fā)之(APNS)遠(yuǎn)程推送實(shí)現(xiàn)代碼,附證書(shū)與真機(jī)調(diào)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
iOS App開(kāi)發(fā)中的UISegmentedControl分段組件用法總結(jié)
UISegmentedControl主要被用來(lái)制作分頁(yè)按鈕或添加跳轉(zhuǎn)到不同位置的標(biāo)簽,這里我們就來(lái)看一下iOS App開(kāi)發(fā)中的UISegmentedControl分段組件用法總結(jié),需要的朋友可以參考下2016-06-06
iOS 斷點(diǎn)上傳文件的實(shí)現(xiàn)方法
這項(xiàng)目開(kāi)發(fā)中,有時(shí)候我們需要將本地的文件上傳到服務(wù)器,簡(jiǎn)單的幾張圖片還好,但是針對(duì)iPhone里面的視頻文件進(jìn)行上傳,為了用戶(hù)體驗(yàn),我們有必要實(shí)現(xiàn)斷點(diǎn)上傳。這篇文章主要介紹了iOS 斷點(diǎn)上傳文件的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-12-12

