1、手势识别器——UIGestureRecognizer 介绍
在ios开发中,除了有关触摸的这组方法来控制使用用者的手指触控外,还可以用UIGestureRecognizer的衍生类来进行判断。
用UIGestureRecognizer的好处在于有现成的手势,开发者不用自己计算手指移动轨迹,创建了这些手势识别器之后可以调用视图的addGestureRecognizer:方法,将手势识别器注册到某个视图组件上。
UIGestureRecognizer是在Touch的基础上封装出来的。
UIGestureRecognizer的子类类别有以下几种:
- UIPanGestureRecognizer(拖动识别器)
- UIPinchGestureRecognizer(捏合识别器)
- UIRotationGestureRecognizer(旋转识别器)
- UITapGestureRecognizer(轻拍识别器)
- UILongPressGestureRecognizer(长按识别器)
- UISwipeGestureRecognizer(扫动识别器)
2、各个手势的例子:
#import "ViewController.h"
@interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UIView *targetView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//单击
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
[self.view addGestureRecognizer:singleTap];
//双击
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapAction:)];
doubleTap.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:doubleTap];
//单击要想执行必须双击失效(如果双击确定偵測失败才會触发单击)
[singleTap requireGestureRecognizerToFail:doubleTap];
//长按手势
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
[self.targetView addGestureRecognizer:longPress];
//捏合手势
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureAction:)];
[self.targetView addGestureRecognizer:pinchGesture];
//拖拽
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[self.targetView addGestureRecognizer:panGesture];
//旋转
UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
[self.targetView addGestureRecognizer:rotation];
//缩放要想执行 必须旋转失效(如果旋转确定偵測失败才會触发缩放)
[pinchGesture requireGestureRecognizerToFail:rotation];
//左横扫
UISwipeGestureRecognizer *leftSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipAction:)];
[self.view addGestureRecognizer:leftSwipeGesture];
leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;
//右横扫
UISwipeGestureRecognizer *rightSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipAction:)];
[self.view addGestureRecognizer:rightSwipeGesture];
rightSwipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
//下横扫
UISwipeGestureRecognizer *downSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipAction:)];
[self.view addGestureRecognizer:downSwipeGesture];
downSwipeGesture.direction = UISwipeGestureRecognizerDirectionDown;
//上横扫
UISwipeGestureRecognizer *upSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipAction:)];
[self.view addGestureRecognizer:upSwipeGesture];
upSwipeGesture.direction = UISwipeGestureRecognizerDirectionUp;
}
#pragma mark -----横扫
-(void)swipAction:(UISwipeGestureRecognizer *)sender{
CATransition *animation = [CATransition animation];//创建CATransition对象
animation.delegate = self;
animation.duration = 1.0f;//动画持续时间
animation.timingFunction = UIViewAnimationCurveEaseInOut;//速度控制函数,控制动画运行的节奏
animation.type = kCATransitionMoveIn; //设置运动type
switch (sender.direction) {
case UISwipeGestureRecognizerDirectionRight: //向右滑
{
animation.subtype = kCATransitionFromLeft;//视图从左开始
}
break;
case UISwipeGestureRecognizerDirectionLeft:
{
animation.subtype = kCATransitionFromRight;//视图向左滑
}
break;
case UISwipeGestureRecognizerDirectionUp://向上滑
{
animation.subtype = kCATransitionFromTop;
}
break;
case UISwipeGestureRecognizerDirectionDown: //向下滑
{
animation.subtype = kCATransitionFromBottom;
}
break;
default:
break;
}
[sender.view.layer addAnimation:animation forKey:@"move in"];
}
#pragma mark ------ 拖拽
-(void)panAction:(UIPanGestureRecognizer *)sender{
//当手势按在视图上面的点,转为父系坐标 拿到中心点
/*CGPoint translatedPoint=[sender translationInView:self.view];
CGFloat firstX;
CGFloat firstY;
if ([sender state]==UIGestureRecognizerStateBegan) {
firstX=[sender.view center].x;
firstY=[sender.view center].y;
}
translatedPoint=CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);
[sender.view setCenter:translatedPoint];*/
//中心拖拽
//当你的状态不等于结束状态,不等于失败状态
/*if (sender.state != UIGestureRecognizerStateEnded && sender.state != UIGestureRecognizerStateFailed) {
CGPoint location = [sender locationInView:sender.view.superview];
sender.view.center = location;
}*/
//视图前置操作
[sender.view.superview bringSubviewToFront:sender.view];
//拖拽
CGPoint center = sender.view.center;
CGFloat cornerRadius = sender.view.frame.size.width / 2;
CGPoint translation = [sender translationInView:self.view];
//NSLog(@"%@", NSStringFromCGPoint(translation));
sender.view.center = CGPointMake(center.x + translation.x,center.y +translation.y);
[sender setTranslation:CGPointZero inView:self.view];
//动画效果
if (sender.state == UIGestureRecognizerStateEnded) {
//计算速度向量的长度,当他小于200时,滑行会很短
CGPoint velocity = [sender velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;
//基于速度和速度因素计算一个终点
float slideFactor = 0.1 * slideMult;
CGPoint finalPoint = CGPointMake(center.x + (velocity.x * slideFactor),center.y + (velocity.y * slideFactor));
//限制最小[cornerRadius]和最大边界值[ self.view.bounds.size.width - cornerRadius],以免拖动出屏幕界限
finalPoint.x = MIN(MAX(finalPoint.x, cornerRadius),self.view.bounds.size.width - cornerRadius);
finalPoint.y = MIN(MAX(finalPoint.y, cornerRadius),self.view.bounds.size.height - cornerRadius);
[UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut
animations:^{
sender.view.center = finalPoint;
}
completion:nil];
}
}
#pragma mark ----- 旋转
-(void)rotationAction:(UIRotationGestureRecognizer *)sender{
sender.view.transform = CGAffineTransformRotate(sender.view.transform, sender.rotation);
sender.rotation=10.0;//旋转速度
}
#pragma mark ----- 缩放
-(void)pinchGestureAction:(UIPinchGestureRecognizer *)sender{
NSLog(@"xxx");
sender.view.transform=CGAffineTransformMakeScale(sender.scale, sender.scale);
}
# pragma mark -----长按
-(void)longPressAction:(UILongPressGestureRecognizer *)sender{
if (sender.state == UIGestureRecognizerStateEnded) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"标题" message:@"选择照片" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *photoAction = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"调用照相机");
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIImagePickerController *imagepicker = [[UIImagePickerController alloc] init];
imagepicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagepicker.delegate = self;
imagepicker.allowsEditing = YES;//允许图片被编辑
imagepicker.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:imagepicker animated:NO completion:nil];
}
}];
[alertController addAction:photoAction];
UIAlertAction *libraryAction=[UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"调用本地相册");
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController *picker =
[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:picker animated:NO completion:nil];
}
}];
[alertController addAction:libraryAction];
UIAlertAction *cancleAction=[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"取消");
}];
[alertController addAction:cancleAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
#pragma mark ---- 单击
-(void)singleTapAction:(UITapGestureRecognizer *)sender{
NSLog(@"单击");
//改变背景颜色
if (sender.view.backgroundColor==[UIColor whiteColor]) {
sender.view.backgroundColor=[UIColor cyanColor];
}else{
sender.view.backgroundColor=[UIColor whiteColor];
}
}
#pragma mark------- 双击
-(void)doubleTapAction:(UITapGestureRecognizer *)sender{
NSLog(@"双击");
}
@end