iOS 手势识别——UIGestureRecognizer

标签: iOS手势识别UIGestureRecognizer处理器
1184人阅读 评论(1) 收藏 举报
分类:

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个手指进行触碰,触碰次数为:1
2016-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 = [[UILongPressGestureRecognizer
		alloc]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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:578925次
    • 积分:6422
    • 等级:
    • 排名:第3774名
    • 原创:117篇
    • 转载:23篇
    • 译文:0篇
    • 评论:284条
    微信公众号
      分享Android相关文章、生活感悟等。
    QQ交流群
    群号 532259820
    博客专栏
    最新评论
    微信公众号
    微信关注我的公众号
    统计