1. 程式人生 > >iOS手勢篇(一)-UIGestureRecognizer屬性詳解

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));
  1. 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外都是連續手勢
  1. delegate.
    代理我們底下再講.

  2. enabled.
    是否響應,預設YES,類似於是否響應,預設是開著的,類似於UIView的userInterfaceEnable.使用者互動是否響應.一下就是用到了手勢的enable屬性.
    小Tips:關閉導航欄的側滑返回

self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  1. view.
    這個View是需要響應手勢的View,建立好了的手勢需要新增到View上才能響應手勢方法(而且使用者互動一定要開啟,view.userInterfaceEnable = YES).

  2. cancelsTouchesInView.
    這個屬性的預設值為YES.
    為YES的時候,手勢處理的事件迴圈中的觸控事件不會發送到檢視.
    為NO的時候,手勢處理的事件迴圈中的觸控事件也會發送到檢視.

舉個例子: 一個UIButton有:1.點按的點下去的事件.2.Tap的手勢.如果為YES的時候.只會響應Tap手勢的方法.如果是NO,那麼二者都響應.

  1. delaysTouchesBegan.
    預設值為NO.
    設定為NO的時候不會暫停在UITouchPhaseBegan與UITouchPhaseMoved狀態的觸控事件傳遞到檢視.
    設定為YES的時候,執行迴圈會暫停UITouchPhaseBegan階段的觸控事件(UITouch)傳遞到檢視.如果接下來能被識別為觸控事件,則丟棄這些觸控物件,如果不能識別.則會以touchesBegan或者是touchesMove來傳遞給檢視物件(UIView)

  2. delaysTouchesEnded.
    預設值為YES.
    當為YES的時候執行迴圈會暫停在UITouchPhaseEnded狀態的觸控事件傳遞到檢視.
    為NO的時候.如果接下來能識別手勢,就會丟棄這些觸控物件,如果不能識別.則會以touchesEnded的形式傳遞給檢視物件.
    設定為NO的時候,手勢識別器分析到相同觸控時會將UITouchPhaseEnded中的觸控物件傳遞到檢視。

  3. allowedTouchTypes
    支援的TouchTypes.

UITouchType 說明
UITouchTypeDirect 使用者手指的觸控
UITouchTypeIndirect 間接觸控,與螢幕分離的裝置產生的觸控,如Apple TV的觸控板
UITouchTypePencil Apple Pencil在螢幕上產生的觸控
UITouchTypeStylus = UITouchTypePencil 同上
  1. 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.)

  2. requiresExclusiveTouchType
    當設定為YES的時候,如果新的手勢和舊的型別不匹配,新手勢將會被手勢識別器自動忽略.
    當設定為NO的時候,手勢識別器會識別allowedTouchTypes裡面支援型別的手勢.

  3. numberOfTouches.
    當前手勢中的觸控

  4. name.
    (在開發過程中,為這個唯一標識手勢識別器的屬性分配一個字串。在除錯程式碼時,可以使用此屬性區分一個手勢識別器和另一個手勢識別器。).