iOS手勢篇(一)-UIGestureRecognizer屬性詳解
1.屬性
@property(nonatomic,readonly) UIGestureRecognizerState state; @property(nullable,nonatomic,weak) id <UIGestureRecognizerDelegate> delegate; @property(nonatomic, getter=isEnabled) BOOL enabled; @property(nullable, nonatomic,readonly) UIView *view; @property(nonatomic) BOOL cancelsTouchesInView; @property(nonatomic) BOOL delaysTouchesBegan; @property(nonatomic) BOOL delaysTouchesEnded; @property(nonatomic, copy) NSArray<NSNumber *> *allowedTouchTypes NS_AVAILABLE_IOS(9_0); @property(nonatomic, copy) NSArray<NSNumber *> *allowedPressTypes NS_AVAILABLE_IOS(9_0); @property (nonatomic) BOOL requiresExclusiveTouchType NS_AVAILABLE_IOS(9_2); @property(nonatomic, readonly) NSUInteger numberOfTouches; @property (nullable, nonatomic, copy) NSString *name API_AVAILABLE(ios(11.0), tvos(11.0));
- state
UIGestureRecognizerState | 說明 |
---|---|
UIGestureRecognizerStatePossible | 識別器尚未識別其手勢,可能正在計算觸控事件,也就是手勢相應之前的狀態(預設狀態). |
UIGestureRecognizerStateBegan | 識別器識別手勢到手勢的開始,將會在下次執行迴圈(runloop)中呼叫. |
UIGestureRecognizerStateChanged | 識別器識別到手勢變化,將會在下次執行迴圈(runloop)中呼叫. |
UIGestureRecognizerStateEnded | 識別器已經接收到被識別為手勢結束的觸控。 action method(我們寫的觸控事件的響應方法)將在下一輪執行迴圈中呼叫,識別器將會將state重置為UIGestureRecognizerStatePossible狀態. |
UIGestureRecognizerStateCancelled | 識別器已經接收到導致取消手勢的觸控。 action method(我們寫的觸控事件的響應方法)將在下一輪執行迴圈中呼叫。 識別器將會將state重置為UIGestureRecognizerStatePossible狀態. |
UIGestureRecognizerStateFailed | 識別器識別失敗狀態。 不會呼叫action(我們寫的觸控事件的響應方法)方法,識別器將會將state重置為UIGestureRecognizerStatePossible狀態. |
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded | 識別器已經接收到被識別為手勢的觸控。 action method(我們寫的觸控事件的響應方法)將在下一輪執行迴圈中呼叫,識別器將會將state重置為UIGestureRecognizerStatePossible狀態. |
// 離散手勢 - 識別離散事件但不報告更改(例如,點按(UIPanGestureRecognizer))的手勢識別器不會通過“已開始”和“已更改”狀態轉換,也不會失敗或被取消
iOS系統中只有UITapGestureRecgnier是離散手勢。離散手勢只會觸發一次,而且一旦識別就無法取消。
既然有離散手勢,那麼
手勢分類 | 說明 | 例項 |
---|---|---|
離散手勢 | 離散手勢只會觸發一次,而且一旦識別就無法取消。 | UITapGestureRecgnier |
連續手勢 | 連續手勢會一直向action method傳送訊息,告訴值改變了 | 除UITapGestureRecgnier外都是連續手勢 |
-
delegate.
代理我們底下再講. -
enabled.
是否響應,預設YES,類似於是否響應,預設是開著的,類似於UIView的userInterfaceEnable.使用者互動是否響應.一下就是用到了手勢的enable屬性.
小Tips:關閉導航欄的側滑返回
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
-
view.
這個View是需要響應手勢的View,建立好了的手勢需要新增到View上才能響應手勢方法(而且使用者互動一定要開啟,view.userInterfaceEnable = YES). -
cancelsTouchesInView.
這個屬性的預設值為YES.
為YES的時候,手勢處理的事件迴圈中的觸控事件不會發送到檢視.
為NO的時候,手勢處理的事件迴圈中的觸控事件也會發送到檢視.
舉個例子: 一個UIButton有:1.點按的點下去的事件.2.Tap的手勢.如果為YES的時候.只會響應Tap手勢的方法.如果是NO,那麼二者都響應.
-
delaysTouchesBegan.
預設值為NO.
設定為NO的時候不會暫停在UITouchPhaseBegan與UITouchPhaseMoved狀態的觸控事件傳遞到檢視.
設定為YES的時候,執行迴圈會暫停UITouchPhaseBegan階段的觸控事件(UITouch)傳遞到檢視.如果接下來能被識別為觸控事件,則丟棄這些觸控物件,如果不能識別.則會以touchesBegan或者是touchesMove來傳遞給檢視物件(UIView) -
delaysTouchesEnded.
預設值為YES.
當為YES的時候執行迴圈會暫停在UITouchPhaseEnded狀態的觸控事件傳遞到檢視.
為NO的時候.如果接下來能識別手勢,就會丟棄這些觸控物件,如果不能識別.則會以touchesEnded的形式傳遞給檢視物件.
設定為NO的時候,手勢識別器分析到相同觸控時會將UITouchPhaseEnded中的觸控物件傳遞到檢視。 -
allowedTouchTypes
支援的TouchTypes.
UITouchType | 說明 |
---|---|
UITouchTypeDirect | 使用者手指的觸控 |
UITouchTypeIndirect | 間接觸控,與螢幕分離的裝置產生的觸控,如Apple TV的觸控板 |
UITouchTypePencil | Apple Pencil在螢幕上產生的觸控 |
UITouchTypeStylus = UITouchTypePencil | 同上 |
-
allowedPressTypes.
支援的UIPress屬性.
這個在iOS裝置上一般用不到,一般在TV OS的開發用得到,比如那個遙控器的點按力度之類的.
**注:**按壓事件發生在,遊戲控制器(通俗點說就是手柄),apple TV的遙控器,或者是其他有物理按鍵的裝置上/(Press events represent interactions with a game controller, AppleTV remote, or other device that has physical buttons. You can determine the type of an event using the type and subtype properties.) -
requiresExclusiveTouchType
當設定為YES的時候,如果新的手勢和舊的型別不匹配,新手勢將會被手勢識別器自動忽略.
當設定為NO的時候,手勢識別器會識別allowedTouchTypes裡面支援型別的手勢. -
numberOfTouches.
當前手勢中的觸控 -
name.
(在開發過程中,為這個唯一標識手勢識別器的屬性分配一個字串。在除錯程式碼時,可以使用此屬性區分一個手勢識別器和另一個手勢識別器。).