手势识别
所有的手勢操作都繼承于UIGestureRecognizer,這個類本身不能直接使用 IOS有六種手勢操作
備注: 1、UIImageView默認是不支持交互的,也就是userInteractionEnabled=NO ,因此要接收觸摸事件(手勢識別),必須設置 ?? userInteractionEnabled=YES(在iOS中UILabel、UIImageView的userInteractionEnabled默認都是NO,UIButton、UITextField、? UIScrollView、UITableView等默認都是YES) 2、輕掃手勢雖然是連續手勢但是它的操作事件只會在識別結束時調用一次,其他連續手勢都會調用多次,一般需要進行狀態判斷;此外輕 掃手勢支持四個方向,但是如果要支持多個方向需要添加多個輕掃手勢 3、手勢沖突
| UITapGestureRecognizer | 點按手勢 |
| UIPinchGestureRecognizer | 捏合手勢 |
| UIPanGestureRecognizer | 拖動手勢 |
| UISwipeGestureRecognizer | 輕掃手勢,支持四個方向的輕掃,但是不同的方向要分別定義輕掃手勢 |
| UIRotationGestureRecognizer | 旋轉手勢 |
| UILongPressGestureRecognizer | 長按手勢 |
? ? ? ? 沖突的原因很簡單,拖動手勢的操作事件是在手勢的開始狀態(狀態1)識別執行的,而輕掃手勢的操作事件只有在手勢結束狀態(狀
? ? ? ? ?態3)才能執行,因此輕掃手勢就作為了犧牲品沒有被正確識別。我們理想的情況當然是如果在圖片上拖動就移動圖片,如果在圖片上?
? ? ? ? 輕掃就翻動圖片。如何解決這個沖突呢?
? ? ? ? 在iOS中,如果一個手勢A的識別部分是另一個手勢B的子部分時,默認情況下A就會先識別,B就無法識別了。要解決這個沖突可以利?
? ? ? ? 用- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;方法來完成。這個方法可
? ? ? ? 以指定某個手勢執行的前提是另一個手勢失敗才會識別執行。也就是說如果我們指定拖動手勢的執行前提為輕掃手勢失敗就可以了,這
? ? ? ? 樣一來當我們手指輕輕滑動時系統會優先考慮輕掃手勢,如果最后發現該操作不是輕掃,那么就會執行拖動。只要將下面的代碼添加到
? ? ? ? ?添加手勢之后就能解決這個問題了。例如:[panGesture requireGestureRecognizerToFail:swipeGestureToRight];
UIGestureRecognizer這個類中定義了這幾種手勢共有的一些屬性和方法(下表僅列出常用屬性和方法):
| 屬性 | |
| @property(nonatomic,readonly) UIGestureRecognizerState state; | 手勢狀態 |
| @property(nonatomic, getter=isEnabled) BOOL enabled; | 手勢是否可用 |
| @property(nonatomic,readonly) UIView *view; | 觸發手勢的視圖(一般在觸摸執行操作中我們可以通過此屬性獲得觸摸視圖進行操作) |
| @property(nonatomic) BOOL delaysTouchesBegan; | 手勢識別失敗前不執行觸摸開始事件,默認為NO;如果為YES,那么成功識別則不執行觸摸開始事件,失敗則執行觸摸開始事件;如果為NO,則不管成功與否都執行觸摸開始事件; |
| 方法 | |
| - (void)addTarget:(id)target action:(SEL)action; | 添加觸摸執行事件 |
| - (void)removeTarget:(id)target action:(SEL)action; | 移除觸摸執行事件 |
| - (NSUInteger)numberOfTouches; | 觸摸點的個數(同時觸摸的手指數) |
| - (CGPoint)locationInView:(UIView*)view; | 在指定視圖中的相對位置 |
| - (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view; | 觸摸點相對于指定視圖的位置 |
| - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer; | 指定一個手勢需要另一個手勢執行失敗才會執行 |
| 代理方法 | |
| - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; | 一個控件的手勢識別后是否阻斷手勢識別繼續向下傳播,默認返回NO;如果為YES,響應者鏈上層對象觸發手勢識別后,如果下層對象也添加了手勢并成功識別也會繼續執行,否則上層對象識別后則不再繼續傳播; |
轉載于:https://www.cnblogs.com/hepingqingfeng/p/5462714.html
總結
- 上一篇: 第八章 熟练dom的几个常用方法
- 下一篇: Nginx之让用户通过用户名密码认证访问