UIKit框架中一共提供了6种类型的手势操作,分别为:点击、捏合、旋转、滑动、拖动、长按。手势需要添加到UIView类以及其子类之上,同时每个UIView可以添加多个手势。
1.UIGestureRecognizer类
UIGestureRecognizer类是一个抽象类,不能直接使用,具体使用过程中需要使用其子类。UIGestureRecognizer一共包括6个子类,分别对应6种手势。
UITapGestureRecognizer:点击。
UIPinchGestureRecognizer:捏合。
UIRotationGestureRecognizer:旋转。
UISwipeGestureRecognizer:滑动。
UIPanGestureRecognizer:拖动,其又包含另外一个子类UIScreenEdgePanGestureRecognizer。
UILongPressGestureRecognizer:长按。
UIGestureRecognizer创建方法创建一个UIGestureRecognizer子类对象需要以下3个步骤:
使用- initWithTarget:action:方法创建一个手势类对象,设置当手势事件发生时,调用的方法。
使用addGestureRecognizer:方法,把手势对象添加到一个UIView的对象上。
实现手势事件发生时所调用的方法。
UIGestureRecognizer类常用属性以及方法
// 初始化手势对象并设置手势发生时调用的方法。
-(instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action;
// 获取手势点击的位置
-(CGPoint)loctionOfTouch:(touchIndex) inView:(nullable UIView*)view;
// 获取手势点击的状态和视图
@property(nonatomic, readonly) UIGestureRecognizerState state;
// 其中常用的UIGestureRecognizerState有以下几个:
UIGestureRecognizerStateBegan:开始手势事件
UIGestureRecognizerStateEnded:结束手势事件
UIGestureRecognizerStateChanged:手势位置发生变化
UIGestureRecognizerStateFailed:无法识别的手势
// 手势事件对应的视图对象
@property(nullable, nonatomic, readonly) UIView *view;
2.点击手势UITapGestureRecognizer
UITapGestureRecognizer类可以用于创建识别点击手势,常用的属性包括:
// 需要点击的次数,用于识别单击或双击,默认为单击。
@property(nonatomic) NSInteger numberOfTapsRequired;
// 点击的手指数,默认为:1
@property(nonatomic) NSInteger numberOfTouchesRequired;
// 单个手指单击手势实现
-(void)viewDidLoad {
[super viewDidLaod];
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 250, 250)];
myView.backgroundColor = [UIColor redColor];
[self.view addSubView:myView];
/*********************************************/
// 单击单手指
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
// 单击
singleTap.numberOfTapsRequired = 1;
// 单手指
singleTap.numberOfTouchesRequired = 1;
/*********************************************/
// 双击双手指
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
// 双击
doubleTap.numberOfTapsRequired = 2;
// 双手指
doubleTap.numberOfTouchesRequired = 2;
/********************************************/
// 添加到myView
[myView addGetsureRecognizer:singleTap];
[myView addGetsureRecognizer:doubleTap];
}
// 实现单击手势触发后的调用的singleTap:方法。
-(void)singleTap:(UITapGestureRecognizer *) tap {
NSLog(@" ");
}
3.捏合与旋转手势UIPinchGestureRecognizer
// 捏合手势UIPinchGestureRecognizer可以获取手势在屏幕坐标系中的缩放比例,根据该缩放比例,可以调整UIView控件的缩放。
@property(nonatomic) CGFloat scale;
// 旋转手势UIRotationGestureRecognizer可以获取手势在屏幕坐标系中的旋转角度,根据该旋转角度,可以调整UIView控件的角度。
@property(nonatomic) CGFloat rotation;
// 捏合手势示例代码
-(void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
imageView.image = [UIImage imageNamed:@"image"];
imageView.userInteractionEnable = YES;
[self.view addSubview:imageView];
// 捏合手势
UIPinchGestureRecongizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
// 旋转手势
UIRotationGestureRecongizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
//
[imageView addGestureRecognizer:pinchGesture];
[imageView addGestureRecognizer:rotationGesture];
}
// 实现图片缩放功能
-(void)pinch:(UIPinchGestureRecognizer *)gesture {
CGFloat scale = gesture.scale;
gesture.view.transform = CGAffineTransformScale(gesture.view.transform, scale, scale)
// 一定要把scale的值重置为1,否则回影响缩放效果,会进一步进行缩放
gesture.scale = 1;
}
// 实现图片旋转功能
-(void)rotation:(UIPinchGestureRecognizer *)gesture {
CGFloat rotation = gesture.rotation;
gesture.view.transform = CGAffineTransformRotate(gesture.view.transform, rotation)
// 一定要把rotation的值重置为0,否则回影响旋转效果
gesture.rotation = 0;
}
//
4.滑动手势UISwipeGestureRecognizer
滑动手势(UISwipeGestureRecognizer)常用于照片管理类App,能够实现照片的滑动显示。滑动手指支持向上、向下、向左、向右四个方面的滑动,在创建滑动手势对象时,需要通过direction属性来指定滑动的方向,默认的滑动方向为向右滑动。
@property(nonatomic) UISwipeGestureRecognizerDirection direction;
其中,UISwipeGestureRecognizerDirection的取值包括以下几点。UISwipeGestureRecognizerDirectionRight:向右,默认。
UISwipeGestureRecognizerDirectionLeft:向左。
UISwipeGestureRecognizerDirectionUp:向上。
UISwipeGestureRecognizerDirectionDown:向下。
// 示例
-(void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
imageView.image = [UIImage imageNamed:@"image"];
imageView.userInteractionEnable = YES;
[self.view addSubview:imageView];
// 滑动手势
UISwipeGestureRecognizer *swipeRightGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
UISwipeGestureRecognizer *swipeLeftGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
swipeLeftGesture.direction = UISwipeGestureRecognizerDirectionLeft;
[imageView addGestureRecognizer:swipeRightGesture];
[imageView addGestureRecognizer:swipeLeftGesture];
self.imageIndex = 0;
}
.5 拖动手势UIPanGestureRecognizer
拖动手势(UIPanGestureRecognizer)可以修改一个UI控件的位置,在有些游戏类App中比较常见。拖动事件发生时,通过translationInView:方法,可以得到一个CGPoint类型的返回值,即位置的偏移量,可以根据偏移量修改对应UI控件的center属性从而实现UI控件的位置移动效果。
-(CGPoint)translationInView:(nullable UIView *) view;
// 示例
-(void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
imageView.image = [UIImage imageNamed:@"image"];
imageView.userInteractionEnable = YES;
[self.view addSubview:imageView];
// 拖动手势
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[imageView addGestureRecognizer:panGesture];
}
// pan:方法,实现UI控件位置更新操作。
-(void) pan:(UIPanGestureRecognizer *)gesture {
CGPoint tranclation = [gesture translationInView.view];
gesture.view.center = CGPointMake(gesture.view.x + translation.x, gesture.view,y + translation.y);
[gesture setTranslation:CGPointZero inView:self.view];
}
6 长按手势UILongPressGestureRecognizer
通过长按手势(UILongPressGestureRecognizer)可以监控手势作用于UI控件的开始长按、长按过程中以及松开等状态,并且设置不同的动作。最常见的应用案例可以参考微信的对讲模式,按住按钮即可开始录音,松开后结束录音并发送给对方。长按手势一定需要和UIGestureRecognizer类的state属性进行配合使用,即通过不同状态state下,实现不同的功能。UIGestureRecognizer类的state属性中,常见的有以下几个。
UIGestureRecognizerStateBegan:开始手势事件;
UIGestureRecognizerStateEnded:结束手势事件;
UIGestureRecognizerStateChanged:手势位置发生变化;
UIGestureRecognizerStateFailed:无法识别的手势。
// 示例
-(void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
imageView.image = [UIImage imageNamed:@"image"];
imageView.userInteractionEnable = YES;
[self.view addSubview:imageView];
// 长按手势
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[imageView addGestureRecognizer:longPressGesture];
}
-(void)longPress:(UILongPressGestureRecognizer *) gesture {
}