IOS各类手势操做实例

先看下效果

手势相关的介绍

IOS中手势操做通常是 UIGestureRecognizer 类的几个手势子类去实现,通常咱们用到的手势就这么5种:ui

一、点击  UITapGestureRecognizeratom

二、平移  UIPanGestureRecognizerspa

三、缩放  UIPinchGestureRecognizer3d

四、旋转  UIRotationGestureRecognizer日志

五、轻扫  UISwipeGestureRecognizercode

咱们上面这个实例中就用到了上面这5种手势,不过其中 点击与轻扫没有体现出来,只是输出了下日志而已,一会看代码orm

下面咱们来分别介绍下这几种手势对象

一、UITapGestureRecognizer 点击手势

UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];
// 点击次数,默认为1,1为单击,2为双击
tapGes.numberOfTapsRequired = 2;

这个点击手势类有一个属性 numberOfTapsRequired 用于设置点击数,就是点击几回才触发这个事blog

二、UIPanGestureRecognizer 平移手势

// 平移手势
- (void)initPanGes{
    
    UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)];
    
    [self.imgView addGestureRecognizer:panGes];
}

- (void)panGes:(UIPanGestureRecognizer*)ges{
    
    // 获取平移的坐标点
    CGPoint transPoint =  [ges translationInView:self.imgView];
}

平移手势自己没太多可设置的属性,在平移事件触发手,能够用  translationInView 方法获取当前平移坐标点事件

三、UIPinchGestureRecognizer 缩放手势

// 缩放手势
- (void)initPinGes{
    
    UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)];
    [self.imgView addGestureRecognizer:pinGes];
}
- (void)pinGes:(UIPinchGestureRecognizer*)ges{
    
    // 缩放
    self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale);
}

缩放手势在事件里面能够获取 scale 属性,表示当前缩放值

四、UIRotationGestureRecognizer 旋转手势

// 旋转手势
- (void)initRotation{
    
    UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)];
    [self.imgView addGestureRecognizer:rotationGes];
}
- (void)rotationGes:(UIRotationGestureRecognizer*)ges{
    
    // 旋转图片
    self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation);
}

旋转手势在事件里面能够经过获取 rotation 属性获取当前旋转的角度

五、UISwipeGestureRecognizer 轻扫手势

// 轻扫手势
- (void)initSwipeGes{
    
    // 建立 从右向左 轻扫的手势
    UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
    // 方向,默认是从左往右
    // 最多只能开启一个手势,若是要开启多个就得建立多个手势
    // 监遵从右向左的方向
    swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.imgView addGestureRecognizer:swipeLeftGes];

}
- (void)swipeGes:(UISwipeGestureRecognizer*)ges{
    
    // ges.direction方向值
    NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);
}

轻扫手势对象须要设置 direction 属性,默认是只监遵从左向右,这是一个枚举值 UISwipeGestureRecognizerDirection

UISwipeGestureRecognizerDirectionRight  从左向右(默认值)

UISwipeGestureRecognizerDirectionLeft    从右向左

UISwipeGestureRecognizerDirectionUp    从下向上

UISwipeGestureRecognizerDirectionDown  从上向下

 

下面看一下咱们上面那个效果图实现代码吧

//
//  ViewController.m
//  各类手势操做
//
//  Created by xgao on 16/3/24.
//  Copyright © 2016年 xgao. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UIGestureRecognizerDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *imgView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self initTapGes];
    [self initPanGes];
    [self initPinGes];
    [self initRotation];
    [self initSwipeGes];
}

// 点击手势
- (void)initTapGes{
    
    UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];
    // 点击次数,默认为1,1为单击,2为双击
    tapGes.numberOfTapsRequired = 2;
    tapGes.delegate = self;
    
    [self.imgView addGestureRecognizer:tapGes];
}
- (void)tapGes:(UITapGestureRecognizer*)ges{
    
    NSLog(@"%s",__func__);
}

// 平移手势
- (void)initPanGes{
    
    UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)];
    
    panGes.delegate = self;
    
    [self.imgView addGestureRecognizer:panGes];
}
- (void)panGes:(UIPanGestureRecognizer*)ges{
    
    // 获取平移的坐标点
    CGPoint transPoint =  [ges translationInView:self.imgView];
    
    // 在以前的基础上移动图片
    self.imgView.transform = CGAffineTransformTranslate(self.imgView.transform, transPoint.x, transPoint.y);
    
    // 复原,必需复原
    // 每次都清空一下消除坐标叠加
    [ges setTranslation:CGPointZero inView:self.imgView];
    
    NSLog(@"%s",__func__);
}

// 缩放手势
- (void)initPinGes{
    
    UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)];
    pinGes.delegate = self;
    
    [self.imgView addGestureRecognizer:pinGes];
}
- (void)pinGes:(UIPinchGestureRecognizer*)ges{
    
    // 缩放
    self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale);
    
    // 复原
    // 每次都清空一下消除叠加
    ges.scale = 1;
}

// 旋转手势
- (void)initRotation{
    
    UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)];
    rotationGes.delegate = self;
    
    [self.imgView addGestureRecognizer:rotationGes];
}
- (void)rotationGes:(UIRotationGestureRecognizer*)ges{
    
    // 旋转图片
    self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation);
    
    // 复原
    // 每次都清空一下消除叠加
    ges.rotation = 0;
    
    NSLog(@"%s",__func__);
}

// 轻扫手势
- (void)initSwipeGes{
    
    // 建立 从右向左 轻扫的手势
    UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
    // 方向,默认是从左往右
    // 最多只能开启一个手势,若是要开启多个就得建立多个手势
    // 监遵从右向左的方向
    swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft;
    swipeLeftGes.delegate = self;
    
    [self.imgView addGestureRecognizer:swipeLeftGes];
    
    
    // 建立 从下向上 轻扫的手势
    UISwipeGestureRecognizer* swipeUpGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
    // 监遵从下向上的方向
    swipeUpGes.direction =  UISwipeGestureRecognizerDirectionUp;
    swipeUpGes.delegate = self;
    
    [self.imgView addGestureRecognizer:swipeUpGes];
}
- (void)swipeGes:(UISwipeGestureRecognizer*)ges{
    
    // ges.direction方向值
    NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);
}


#pragma mark - UIGestureRecognizerDelegate

// 判断是否能触发手势
- (BOOL)gestureRecognizerShouldBegin:(UITapGestureRecognizer *)gestureRecognizer{
    
    return YES;
}

// 是否容许多手势操做,不是多触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    
    return YES;
}

@end

 

这里须要注意的有两点:

一、对于 平移、缩放、旋转 这3个手势,咱们若是要用它的值去处理的话,要记得复原!复原!复原!这点很重要!重要的事说3遍~~

  平移手势里面咱们须要设置 setTranslation:CGPointZero 来复原它的坐标值,否则下一次事件触发这个坐标值会叠加
  缩放手势里面设置 ges.scale = 1 来复原它的缩放值
  旋转手势里面设置 ges.rotation = 0 来复原它的角度值

二、假如咱们须要多手势一块儿用的时候就须要设置下delegate 里面的一个返回参数的方法了

  

// 是否容许多手势操做,不是多触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    
    return YES;
}

此次分享就到这里~~有什么不清楚的,就留言吧 ^_^

相关文章
相关标签/搜索