zoukankan      html  css  js  c++  java
  • 手势的简单使用(6种)以及代理方法

    注意:全部都是在UIView上操作手势

    代码:

      1 #import "ViewController.h"
      2 @interface ViewController () <UIGestureRecognizerDelegate>
      4 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
      5 @end
      7 @implementation ViewController
      8 - (void)viewDidLoad {
      9     [super viewDidLoad];
     10     //只要是手势,默认都是相对于原来位置,且默认控制只支持一个手势!!若想支持多个手势,详见下面的代理方法
     11 //    [self setUpRotation];
     12 //    [self setUpPinch];
     13     [self setUpPan];
     14 }
     15 
     16 #pragma mark - 点按手势
     17 - (void)setUpTap
     18 {
     19     //创建点按手势
     20     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
     21     //需要连续点3次才能触发
     22     //    tap.numberOfTapsRequired = 3;
     23     //往imageView上添加点按手势
     24     [self.imageView addGestureRecognizer:tap];
     25     //设置点按手势代理
     26     tap.delegate = self;
     27 }
     28 
     29 - (void)tap:(UITapGestureRecognizer *)tap
     30 {
     31     NSLog(@"%s",__func__);
     32 }
     33 
     34 #pragma mark - 长按手势
     35 //默认触发两次(开始触摸半秒后一次,结束触摸一次)
     36 - (void)setUpLongPress
     37 {
     38     UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
     39     [self.imageView addGestureRecognizer:longPress];
     40     longPress.delegate = self;
     41 }
     42 
     43 - (void)longPress:(UILongPressGestureRecognizer *)longPress
     44 {
     45     开始的时候触摸
     46     if (longPress.state == UIGestureRecognizerStateBegan) {
     47        NSLog(@"%s",__func__);
     48     }
     49     结束的时候触摸
     50     if (longPress.state == UIGestureRecognizerStateEnded) {
     51         NSLog(@"%s",__func__);
     52     }
     53 }
     54 
     55 #pragma mark - 轻扫手势
     56 - (void)setUpSwipe
     57 {
     58     //默认轻扫手势往右划屏幕
     59     UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
     60     //向上划
     61     swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
     62     [_imageView addGestureRecognizer:swipeUp];
     63     //一个清扫手势只支持一个方向,如果想支持多个方向,必须创建多个
     64     UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
     65     //向下划
     66     swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
     67     [_imageView addGestureRecognizer:swipeDown];
     68 }
     69 - (void)swipe:(UISwipeGestureRecognizer *)swipe
     70 {
     71     NSLog(@"%s",__func__);
     72 }
     73 
     74 #pragma mark - 旋转手势
     75 //默认传递的角度都相对于最开始的位置
     76 - (void)setUpRotation
     77 {
     78     UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
     79     rotation.delegate = self;
     80     [self.imageView addGestureRecognizer:rotation];
     81 }
     82 - (void)rotation:(UIRotationGestureRecognizer *)rotation
     83 {
     84     //让图片随着手势旋转而旋转,旋转的角度相当于初始位置的值,配合rotation.rotation = 0;无法转动
     85 //    self.imageView.transform = CGAffineTransformMakeRotation(rotation.rotation);
     86     //手势旋转一下能让图片高速旋转N圈,并且不受控制,方向不容易确定。配合rotation.rotation = 0;后角度一直为0
     87     self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotation.rotation);   
     88     //复位
     89     rotation.rotation = 0;
     90     //获取手势旋转的角度
     91     NSLog(@"%f",rotation.rotation);
     92 }
     93 
     94 #pragma mark - 捏合手势
     95 //两根手指放大缩小图片
     96 - (void)setUpPinch
     97 {
     98     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
     99     pinch.delegate = self;
    100     [self.imageView addGestureRecognizer:pinch];
    101 }
    102 - (void)pinch:(UIPinchGestureRecognizer *)pinch
    103 {
    104     //放大的比例相对于原始点,注意:这个不能配合pinch.scale = 1使用,否则不能放大
    105 //    self.imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);
    106     //随着两手指的距离增大,图片会无规则的迅速的放大或者缩小(此处无法控制放大还是缩小),注意:配合pinch.scale = 1使用会正常的放大和缩小
    107     self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinch.scale, pinch.scale);
    108     //复位
    109     pinch.scale = 1;
    110     NSLog(@"%f",pinch.scale);
    111 }
    112 
    113 #pragma mark - 拖拽
    114 //移动视图
    115 - (void)setUpPan
    116 {
    117     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    118     [self.imageView addGestureRecognizer:pan];
    119 }
    120 - (void)pan:(UIPanGestureRecognizer *)pan
    121 {
    122     //获取手势的移动,相对于原始点
    123     CGPoint transP = [pan translationInView:self.imageView];
    124     self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);
    125     //复位
    126     [pan setTranslation:CGPointZero inView:self.imageView];
    127     NSLog(@"%@",NSStringFromCGPoint(transP));
    128 }
    129 @end

    代理方法:

     1 是否允许同时支持多个手势,默认只支持一个手势,要调用此方法注意设置代理
     2 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
     3 {
     4     return YES;
     5 }
     6 
     7 是否允许开始触发手势
     8 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
     9 {
    10     return NO;
    11 }
    12 
    13 是否允许接收手机的触摸(可以控制触摸的范围)
    14 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    15 {
    16     //获取当前的触摸点
    17     CGPoint currentP = [touch locationInView:self.imageView];
    18       在图片的左半区域可以接受触摸
    19     if (currentP.x < self.imageView.bounds.size.width * 0.5) {
    20         return YES;
    21     }else {
    22         return NO;
    23     }
    24 }
  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/hissia/p/5451216.html
Copyright © 2011-2022 走看看