国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS開發之手勢識別

2020-02-19 15:49:05
字體:
來源:轉載
供稿:網友

說到iOS開發手勢識別,相信大家并不陌生,這些手勢可以完全實現與觸摸事件,蘋果是將常用的觸摸事件封裝成手勢提供給用戶,武林技術頻道帶給大家的知識,請繼續關注下文。

一、UIGestureRecognizer簡單介紹

我們已經學習了觸摸事件處理,但觸摸事件處理起來很麻煩,每個觸摸事件處理都需要實現3個touches方法,比較繁瑣,實際上我們可以使用更加簡單的觸摸事件處理操作,那就是 手勢識別UIGestureRecognizer 。

手勢識別操作基類UIGestureRecognizer不能直接使用,我們常使用的是它的子類,這些手勢操作類都繼承自UIGestureRecognizer類

常用手勢識別子類:

點按手勢 UITapGestureRecognizer
捏合手勢 UIPinchGestureRecognizer
拖動手勢 UIPanGestureRecognizer
輕掃手勢 UISwipeGestureRecognizer【4個方向分離】
旋轉手勢 UIRotationGestureRecognizer
長按手勢 UILongPressGestureRecognizer

二、UIGestureRecognizer屬性

對象屬性:

?

?

@property (nonatomic , readonly) UIGestureRecognizerState state;/*< 手勢狀態 */
@property (nonatomic , getter=isEnabled) BOOL enabled;/*< 手勢是否可用 */
@property (nonatomic , readonly) UIView *view;/*< 觸發手勢的視圖 */
@property (nonatomic , assign) BOOL delaysTouchesBegan;/*< 手勢識別失敗前不執行觸摸開始事件,默認為NO */

?

手勢識別狀態state:

?

?

typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
??? UIGestureRecognizerStatePossible,?? // 尚未識別是何種手勢操作(但可能已經觸發了觸摸事件),默認狀態
??? UIGestureRecognizerStateBegan,????? // 手勢已經開始,此時已經被識別,但是這個過程中可能發生變化,手勢操作尚未完成
??? UIGestureRecognizerStateChanged,??? // 手勢狀態發生轉變
??? UIGestureRecognizerStateEnded,????? // 手勢識別操作完成(此時已經松開手指)
??? UIGestureRecognizerStateCancelled,? // 手勢被取消,恢復到默認狀態
??? UIGestureRecognizerStateFailed,???? // 手勢識別失敗,恢復到默認狀態
??? UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢識別完成,同UIGestureRecognizerStateEnded
};

?

左圖為 短手勢 的狀態轉變,右圖為 長手勢 的狀態轉變

三、UIGestureRecognizer方法

?

?

#pragmX mark 添加觸摸執行事件
- (void)addTarget:(id)target action:(SEL)action;
#pragma mark 移除觸摸執行事件
- (void)removeTarget:(id)target action:(SEL)action;
#pragma mark 觸摸點的個數(同時觸摸的手指數)
- (NSUInteger)numberOfTouches;
#pragma mark 在指定視圖中的相對位置
- (CGPoint)locationInView:(UIView*)view;
#pragma mark 觸摸點相對于指定視圖的位置
- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view;
#pragma mark 指定一個手勢需要另一個手勢執行失敗才會執行
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

?

四、UIGestureRecognizer使用

?

?

# 創建手勢識別器對象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
# 設置手勢識別器對象的具體屬性
tap.numberOfTapsRequired = 2;? // 連續敲擊2次
tap.numberOfTouchesRequired = 2;// 需要2根手指一起敲擊?
# 添加手勢識別器到對應的view上
[self.myView addGestureRecognizer:tap];
# 監聽手勢的觸發
[tap addTarget:self action:@selector(tapView:)];

?

五、多手勢沖突

在iOS中,如果一個手勢A的識別部分是另一個手勢B的子部分,默認情況下A就會先識別,B就無法識別了,

比如拖動手勢A和輕掃手勢B,輕掃手勢只在手勢結束狀態才能執行,而拖動手勢在手勢開始的時候執行,這兩個手勢一起觸發,輕掃手勢就成了犧牲品。

解決手勢沖突,就是利用一個方法:

?

?

-(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

?

該方法指定一個手勢需要另外一個手勢識別失敗才會執行

比如解決拖動手勢和輕掃手勢沖突:

?

?

// 拖動手勢的執行需要右輕掃手勢的失敗為前提
[panGesture requireGestureRecognizerToFail:swipeGestureToRight];
// 拖動手勢的執行需要左輕掃手勢的失敗為前提
[panGesture requireGestureRecognizerToFail:swipeGestureToLeft];

?

六、UIGestureRecognizerDelegate代理

代理方法:

?

?

#pragma mark 一個控件識別手勢后是否沿著響應者鏈條繼續傳播手勢識別,默認返回NO
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

?

?

?

用該代理方法可以實現兩個不同控件的手勢同時執行,需要讓該方法返回YES,手勢識別就能傳遞給不同控件

大家看完上文的iOS開發之手勢識別之后,知道接下來應該怎么操作了吧。總之,為了讓我更快熟悉技術知識,可以多多關注武林技術頻道!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常州市| 厦门市| 安宁市| 大厂| 池州市| 黄石市| 涟水县| 奉化市| 库车县| 安顺市| 鹰潭市| 甘谷县| 当涂县| 达尔| 阿鲁科尔沁旗| 凤山市| 上犹县| 郯城县| 雷山县| 石柱| 革吉县| 玉门市| 永和县| 铁岭县| 申扎县| 西乡县| 衢州市| 卢龙县| 萨迦县| 蕲春县| 长治县| 八宿县| 玛多县| 商河县| 荣昌县| 安顺市| 星座| 大名县| 古蔺县| 龙游县| 福贡县|