iOS 手势识别——UIGestureRecognizer

来源:互联网 发布:知子于归 诗经 编辑:程序博客网 时间:2024/06/05 03:17

UIGestureRecognizer:

手势处理器,用来处理用户触碰事件。

有这几个子类:

  • UITapGestureRecognizer    :         处理点击手势
  • UILongPressGestureRecognizer: 处理长按手势
  • UIPinchGestureRecognizer:         处理捏合手势
  • UIRotationGestureRecognizer:     处理旋转手势
  • UISwipeGestureRecognizer:        处理滑动手势
  • UIPanGestureRecognizer:            处理拖动手势

使用处理器步骤

  1. 根据程序需要创建对应的手势处理器对象。(需要指定target和action参数)
  2. 设置控件允许用户交互。(有的控件默认不允许用户交互,如:UILable、UIImageView,则将该控件userInteractionEnabled属性设为YES;如果希望控件支持多点触碰,则将multipleTouchEnabled设为YES)。
  3. 为控件添加手势处理器。(调用控件的addGestureRecognizer:方法添加手势处理器。)
UIGestureRecognizer常用属性和方法:
@property(nonatomic, getter=isEnabled) BOOL enabled;  // default is YES 用于设置和返回处理器是否可用。@property(nonatomic,readonly) UIGestureRecognizerState state;  // the current state of the gesture recognizer@property(nullable, nonatomic,readonly) UIView *view;//返回激发该手势的UI控件。- (NSUInteger)numberOfTouches;//返回该手势包含触碰点数,即几个手指进行触碰。- (CGPoint)locationInView:(nullable UIView*)view;//返回该手势在view控件中的触碰位置- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(nullable UIView*)view;//返回该手势中第几个触碰点在view控件中的位置。

UITapGestureRecognizer 点击手势


@property (nonatomic) NSUInteger  numberOfTapsRequired;       // Default is 1. The number of taps required to match 该手势处理器只处理几次触碰事件@property (nonatomic) NSUInteger  numberOfTouchesRequired __TVOS_PROHIBITED;    // Default is 1. The number of fingers required to match 该手势处理器只处理几个手指的触碰事件

接下来看一下其使用。
#import <QuartzCore/QuartzCore.h>#import "FKViewController.h"@interface FKViewController ()@end@implementation FKViewController- (void)viewDidLoad{[super viewDidLoad];self.view.backgroundColor = [UIColor lightGrayColor];self.uiviewTap.layer.borderWidth = 2;self.uiviewTap.layer.cornerRadius = 6;// 设置uiviewTap控件支持用户交互self.uiviewTap.userInteractionEnabled = YES;// 设置uiviewTap控件支持多点触碰self.uiviewTap.multipleTouchEnabled = YES;    // 创建手势处理器,指定使用该控制器的handleTap:方法处理手势    UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]        initWithTarget:self action:@selector(handleTap:)];    // 设置该点击手势处理器只处理几次连击事件    tapGesture.numberOfTapsRequired = 1;    // 设置该点击手势处理器只处理几个手指的触碰事件    tapGesture.numberOfTouchesRequired = 1;    // 为uiviewTap控件添加手势处理器。    [self.uiviewTap addGestureRecognizer:tapGesture];}// 实现手势处理器的方法,该方法应该声明一个形参。// 当该方法被激发时,手势处理器会作为参数传给该方法的参数。- (void) handleTap:(UITapGestureRecognizer*)gesture{NSUInteger touchNum = gesture.numberOfTouches;NSUInteger tapNum = gesture.numberOfTapsRequired;    NSLog(@"%@",[NSString stringWithFormat:                 @"用户使用%d个手指进行触碰,触碰次数为:%d" , touchNum , tapNum]);self.label.text = [NSString stringWithFormat:@"用户使用%d个手指进行触碰,触碰次数为:%d" , touchNum , tapNum];// 指定2秒后清除label的文本[self.label performSelector:@selector(setText:)withObject:@"" afterDelay:2];    NSLog(@"location inview uiviewTap:%@",NSStringFromCGPoint([gesture locationInView:_uiviewTap]));    NSLog(@"location inveiw self.view:%@",NSStringFromCGPoint([gesture locationInView:self.view]));}@end

因为numberOfTouchesRequired为1,所以用两个或更多手指进行点击时不响应该事件。
而一个手指点击可以响应,输出如下:
2016-08-31 10:00:23.431 TapTest[659:552830] 用户使用1个手指进行触碰,触碰次数为:12016-08-31 10:00:23.433 TapTest[659:552830] location inview uiviewTap:{139, 123}2016-08-31 10:00:23.433 TapTest[659:552830] location inveiw self.view:{159, 221}

当然实际开发时,也可以根据需要设置多个手指、或多次连击事件。
对于locationInView方法:当numberOfTapsRequired>1时,则显示第一次点击的位置。
当numberOfTouchesRequired>1时,则显示这几个手指的中心位置。

对于locationOfTouch:inView: 当numberOfTapsRequired>1时,则显示第一次点击的位置。


UILongPressGestureRecognizer长按手势

UILongPressGestureRecognizer类中的几个属性
@property (nonatomic) NSUInteger numberOfTapsRequired;      // Default is 0. 该属性表示长按之前连续点击的次数。@property (nonatomic) NSUInteger numberOfTouchesRequired __TVOS_PROHIBITED;   // Default is 1. 该手势需要手指数@property (nonatomic) CFTimeInterval minimumPressDuration; // Default is 0.5. 长按手势需要长按的最短时间。@property (nonatomic) CGFloat allowableMovement;<span style="font-family: Menlo;">// Default is 10.手势允许移动的距离</span>

当修改numberOfTapsRequired值,则该需要先连击几次(次数为numberOfTapsrequired的值),然后再长按,这样才可以被识别。

numberOfTouchesRequired 识别手指数量。

minimumPressDuration    指定至少长按多少秒才会触发该长按手势。

allowableMovement       指定该长按手势允许用户移动手指的最大距离。如果超过此距离,则长按手势失效。


使用方式和点击手势类似。

// 创建一个手势处理器,用于检测、处理长按手势UILongPressGestureRecognizer* longGesture = [[UILongPressGestureRecognizeralloc]initWithTarget:self action:@selector(longPress:)];    //longGesture.numberOfTapsRequired = 1;    longGesture.numberOfTouchesRequired = 1;    longGesture.minimumPressDuration = 1;    longGesture.allowableMovement = 11;// 为该控件添加手势处理器[self.view addGestureRecognizer:longGesture];

- (void) longPress:(UILongPressGestureRecognizer*)gesture方法中处理此事件。


UIPinchGestureRecognizer捏合手势


捏合手势,由名可以知道,该手势是个什么样的操作。
使用UIPinchGestureRecognizer处理捏合手势的步骤与UITapGestureRecognizer的步骤完全相同。
UIPinchGestureRecognizer中定义了两个属性表示捏合的相关信息。
</pre><pre name="code" class="objc">@property (nonatomic)          CGFloat scale;    //捏合的比例 @property (nonatomic,readonly) CGFloat velocity;  //捏合的速度

使用方法:
// 设置gv控件支持用户交互self.gv.userInteractionEnabled = YES;// 设置gv控件支持多点触碰self.gv.multipleTouchEnabled = YES;// 创建手势处理器,指定使用该控制器的handlePinch:方法处理手势UIPinchGestureRecognizer* gesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];// 为gv控件添加手势处理器。[self.gv addGestureRecognizer:gesture];

-(void)handlePinch:(UIPinchGestureRecognizer *)gesture{    CGFloat scale = gesture.scale;    CGFloat velocity = gesture.velocity;}

具体响应可以自己写了。

其他几个手势处理器用法和这几个类似。就不再一一说了。

2 0
原创粉丝点击