iOS 手势识别——UIGestureRecognizer
来源:互联网 发布:知子于归 诗经 编辑:程序博客网 时间:2024/06/05 03:17
UIGestureRecognizer:
手势处理器,用来处理用户触碰事件。
有这几个子类:
- UITapGestureRecognizer : 处理点击手势
- UILongPressGestureRecognizer: 处理长按手势
- UIPinchGestureRecognizer: 处理捏合手势
- UIRotationGestureRecognizer: 处理旋转手势
- UISwipeGestureRecognizer: 处理滑动手势
- UIPanGestureRecognizer: 处理拖动手势
使用处理器步骤:
- 根据程序需要创建对应的手势处理器对象。(需要指定target和action参数)
- 设置控件允许用户交互。(有的控件默认不允许用户交互,如:UILable、UIImageView,则将该控件userInteractionEnabled属性设为YES;如果希望控件支持多点触碰,则将multipleTouchEnabled设为YES)。
- 为控件添加手势处理器。(调用控件的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
- iOS 手势识别——UIGestureRecognizer
- ios 手势识别UIGestureRecognizer
- iOS--手势识别UIGestureRecognizer
- UIGestureRecognizer iOS手势识别器
- iOS开发 - 手势识别(UIGestureRecognizer)
- iOS开发 手势识别UIGestureRecognizer
- iOS之UIGestureRecognizer手势识别
- IOS开发之手势——UIGestureRecognizer
- iOS触摸手势——UIGestureRecognizer
- iOS触摸手势——UIGestureRecognizer
- IOS开发之手势——UIGestureRecognizer
- IOS开发之手势—UIGestureRecognizer 共存
- ios-day17-05(手势识别器(UIGestureRecognizer)之敲击——UITapGestureRecognizer)
- iOS 笔记五:手势识别 UIGestureRecognizer
- iOS 手势识别与操作 UIGestureRecognizer
- iOS编程-------UIImageView、手势识别器UIGestureRecognizer
- iOS开发 - 手势识别(UIGestureRecognizer) --转载
- IOS开发之手势——UIGestureRecognizer 手势共存
- 武器的练习7Army
- Loadrunner开发的socket协议脚本服务端无法通过解决方法
- 武器的练习8TeatArmy
- STM32硬件调试过程遇中到Delay_ms()函数卡死的问题
- 关于Firefox浏览器submit提交无效的问题
- iOS 手势识别——UIGestureRecognizer
- MYSQL索引入门
- 还在为一个个粘贴lib文件名苦恼么?所有lib文件名写入TXT方法(CMD命令dir)
- Leetcode 258. Add Digits
- grep 命令
- android 控件绘制完成的监听
- 11 多线程累加问题
- 表选项
- 做APP,从头到尾产品经理需要做什么?—项目上线后