iOS手势篇(一)-UIGestureRecognizer属性详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18683985/article/details/82986839

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.
    (在开发过程中,为这个唯一标识手势识别器的属性分配一个字符串。在调试代码时,可以使用此属性区分一个手势识别器和另一个手势识别器。).

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/82986839