• iOS手势识别


      1 /**
      2  一. 手势说明
      3  
      4  0> UIGestureRecognizer     所有手势识别的父类,不允许直接使用
      5  
      6     最常用的属性:
      7     view:   发生手势的视图
      8     state:  手势当前的状态,主要用于连续手势,对于离散手势一般不使用
      9  
     10  1> UITapGestureRecognizer          点按手势(离散手势,其他手势都是连续手势)
     11  
     12     属性:
     13     numberOfTapsRequired       点击次数,单击双击
     14     numberOfTouchesRequired    手指根数
     15  
     16  2> UILongPressGestureRecognizer    长按手势
     17  
     18  3> UIPanGestureRecognizer          拖动手势
     19 
     20     方法:
     21     // 在视图中拖动的距
     22     - (CGPoint)translationInView:(UIView *)view;
     23     // 在视图中拖动的速度
     24      - (CGPoint)velocityInView:(UIView *)view;
     25  
     26  4> UIPinchGestureRecognizer        捏合手势
     27  
     28     属性:
     29     scale           比例
     30  
     31  5> UIRotationGestureRecognizer     旋转手势
     32  
     33     属性
     34     rotation        旋转角度
     35  
     36  6> UISwipeGestureRecognizer        轻扫手势,通常添加到根视图上
     37     
     38     属性
     39     numberOfTouchesRequired     参与轻扫手势的手指根数
     40     direction                   轻扫的方向
     41  
     42     提示:
     43     1) 如果要检测几个方向的轻扫,需要分别实例化几个轻扫手势
     44     2) 轻扫手势虽然是连续手势,但是不需要去处理UIGestureRecognizerStateChanged状态(因为是在手指离开屏幕后,该手势才被识别 45  46  */
     47 
     48 - (void)viewDidLoad
     49 {
     50     [super viewDidLoad];
     51     
     52     // 0. 实例化UIImageView
     53     UIImage *image = [UIImage imageNamed:@"001"];
     54     UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
     55     [imageView setFrame:kImageFrame];
     56     [self.view addSubview:imageView];
     57     [imageView setUserInteractionEnabled:YES];
     58     self.imageView = imageView;
     59     
     60     // 1. 添加点按手势
     61     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
     62     // 定义双击
     63     tap.numberOfTapsRequired = 2;
     64     [imageView addGestureRecognizer:tap];
     65     
     66     // 2. 添加长按手势
     67     UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTap:)];
     68     [imageView addGestureRecognizer:longTap];
     69     
     70     // 3. 拖动手势
     71     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
     72     
     73     [imageView addGestureRecognizer:pan];
     74     
     75     // 4. 捏合手势
     76     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
     77     [imageView addGestureRecognizer:pinch];
     78     
     79     // 5. 旋转手势
     80     UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
     81     [imageView addGestureRecognizer:rotation];
     82     
     83     // 6. 轻扫手势
     84     // 如果要做清扫手势,需要分别实例化4个方向的手势
     85     UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
     86     
     87     swipeUp.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
     88     
     89     [self.view addGestureRecognizer:swipeUp];
     90 }
     91 
     92 #pragma mark - 点按手势
     93 - (void)tap:(UITapGestureRecognizer *)recognizer
     94 {
     95     // 双击放大图片
     96     UIImageView *imageView = (UIImageView *)recognizer.view;
     97 
     98     [UIView animateWithDuration:0.8f animations:^{
     99         [imageView setTransform:CGAffineTransformScale(imageView.transform, 2.0, 2.0)];
    100     } completion:^(BOOL finished) {
    101         [UIView animateWithDuration:0.5f animations:^{
    102             [imageView setTransform:CGAffineTransformScale(imageView.transform, 0.5, 0.5)];
    103         }];
    104     }];
    105 }
    106 
    107 #pragma mark - 长按手势
    108 - (void)longTap:(UILongPressGestureRecognizer *)recognizer
    109 {
    110     NSLog(@"长按");
    111     // 长按旋转图片
    112     // 开始长按
    113     // 在形变时,iOS采取就近原则旋转,如果不能按照希望的方向旋转,可以增加一些修正值,例如0.01
    114     // 直接通过形变属性,要实现一次性转一圈,比较困难,可以分两次进行
    115     if (UIGestureRecognizerStateBegan == recognizer.state) {
    116         [UIView animateWithDuration:0.8f animations:^{
    117             [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, M_PI - 0.01)];
    118         }];
    119     } else if (UIGestureRecognizerStateEnded == recognizer.state) {
    120         [UIView animateWithDuration:0.8f animations:^{
    121             [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, M_PI - 0.01)];
    122         } completion:^(BOOL finished) {
    123             // 清除所有的形变属性
    124             [recognizer.view setTransform:CGAffineTransformIdentity];
    125         }];
    126     }
    127 }
    128 
    129 #pragma mark - 拖动手势
    130 - (void)pan:(UIPanGestureRecognizer *)recognizer
    131 {
    132     CGPoint translation = [recognizer translationInView:self.view];
    133     
    134     // 让图像根据手指移动
    135     if (UIGestureRecognizerStateChanged == recognizer.state) {
    136         // 形变参数,有Make的时候,是相对初始位置计算的
    137         // 没有Make是递增修改形变的
    138         [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
    139         
    140         // 拖动手指中的平移距离是相对于初始位置,如果使用CGAffineTransformTranslate累加形变方法
    141         // 需要在每次位移之后,重置recognizer的位移量,就是将位移量清零
    142         [recognizer setTranslation:CGPointZero inView:recognizer.view];
    143     }
    144 }
    145 
    146 #pragma mark - 捏合手势
    147 - (void)pinch:(UIPinchGestureRecognizer *)recognizer
    148 {
    149     // 调整图像的显示比例
    150     if (UIGestureRecognizerStateChanged == recognizer.state) {
    151         
    152         // 等比例缩放
    153         [recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale)];
    154         
    155         // 在设置累加形变参数时,需要充值手势的缩放比例
    156         recognizer.scale = 1.0f;
    157     }
    158 }
    159 
    160 #pragma mark - 旋转手势
    161 - (void)rotate:(UIRotationGestureRecognizer *)recognizer
    162 {
    163     if (UIGestureRecognizerStateChanged == recognizer.state) {
    164         recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
    165         
    166         // 重置旋转量
    167         recognizer.rotation = 0.0f;
    168     }
    169 }
    170 
    171 #pragma mark - 轻扫手势
    172 - (void)swipe:(UISwipeGestureRecognizer *)recognizer
    173 {
    174     NSLog(@"%d", recognizer.direction);
    175     if (UISwipeGestureRecognizerDirectionDown == recognizer.direction) {
    176         NSLog(@"向下");
    177     } else if (UISwipeGestureRecognizerDirectionUp == recognizer.direction) {
    178         NSLog(@"向上");
    179     } else if (UISwipeGestureRecognizerDirectionLeft == recognizer.direction) {
    180         NSLog(@"向左");
    181     } else if (UISwipeGestureRecognizerDirectionRight == recognizer.direction) {
    182         NSLog(@"向右");
    183     }
    184 }
  • 相关阅读:
    AO中的GraphicsLayer---------元素的容器
    Spring中基于Java的配置@Configuration和@Bean用法
    spring注解开发AnnotationConfigApplicationContext的使用
    java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader")
    java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory的解决办法
    Multiple markers at this line @Override的解决方法
    springmvc-mvc:resource标签使用
    SpringMVC <mvc:view-controller path=""/>标签
    深入理解Spring MVC 思想
    解决 Eclipse 导入项目后 Maven Dependencies missing jar 问题
  • 原文地址:https://www.cnblogs.com/orzmj123/p/3500767.html
Copyright © 2020-2023  润新知