zoukankan      html  css  js  c++  java
  • [iOS UI进阶

    A.系统提供的手势识别器
    Image(8)
     
    1.敲击手势 UITapGestureRecognizer
    numberOfTapsRequired: 敲击次数
    numberOfTouchesRequired: 同时敲击触碰数(手指数)
     1 - (void) testTap {
     2     // 创建手势识别器
     3     UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRun:)];
     4     tapRec.numberOfTapsRequired = 3; // 触发需要点击的次数
     5     tapRec.numberOfTouchesRequired = 2; // 触发需要同时点击的点数目
     6    
     7     // 配置手势识别器到控件
     8     [self.hvwView addGestureRecognizer: tapRec];
     9 }
    10 
    11 /** tap手势的事件处理方法 */
    12 - (void) tapRun:(UITapGestureRecognizer *) tapRec {
    13     NSLog(@"tapRun");
    14 }
    2.长按手势 UILongPressGestureRecognizer
    minimumPressDuration: 长按生效时间
    numberOfTouchesRequired: 需要的同时点击数
    numberOfTapsRequired: 需要的点击次数
    allowableMovement: 长按有效移动范围(从点击开始,长按移动的允许范围)
    ps:移动的时候会不断调用目标方法
    1 - (void) testLongPress {
    2     UILongPressGestureRecognizer *longRec = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressRun:)];
    3    
    4     longRec.minimumPressDuration = 2; // 长按生效时间
    5     longRec.allowableMovement = 50; // 长按允许移动范围,单位:px
    6    
    7     [self.hvwView addGestureRecognizer:longRec];
    8 }
     
    3.轻扫手势 UISwipeGestureRecognizer
    direction:扫的方向 上下左右
    1 typedef enum {
    2    UISwipeGestureRecognizerDirectionRight = 1 << 0,
    3    UISwipeGestureRecognizerDirectionLeft  = 1 << 1,
    4    UISwipeGestureRecognizerDirectionUp    = 1 << 2,
    5    UISwipeGestureRecognizerDirectionDown  = 1 << 3
    6 } UISwipeGestureRecognizerDirection;
     
    1 - (void) testSwipe {
    2     UISwipeGestureRecognizer *swipeRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRun:)];
    3     swipeRec.direction = UISwipeGestureRecognizerDirectionRight; // 轻扫的方向
    4    
    5     [self.hvwView addGestureRecognizer:swipeRec];
    6 }
    4.捏合手势 UIPinchGestureRecognizer
    scale: 捏合的距离
     
     1 - (void) testPinch {
     2     UIPinchGestureRecognizer *rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchRun:)];
     3    
     4     [self.hvwView addGestureRecognizer:rec];
     5 }
     6 
     7 - (void) pinchRun:(UIPinchGestureRecognizer *) rec {
     8     rec.view.transform = CGAffineTransformScale(rec.view.transform, rec.scale, rec.scale);
     9    
    10     // 一定要复位!!!不然按住捏合会不断叠加倍数
    11     rec.scale = 1;
    12 }
     
    Image(9)  Image(10)
     
    5.旋转手势 UIRotationGestureRecognizer
    rotation: 旋转了的角度
     1 - (void) testRotation {
     2     UIRotationGestureRecognizer *rotationRec = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationRun:)];
     3    
     4     [self.hvwView addGestureRecognizer:rotationRec];
     5 }
     6 
     7 - (void) rotationRun:(UIRotationGestureRecognizer *) rec {
     8     rec.view.transform = CGAffineTransformRotate(rec.view.transform, rec.rotation);
     9    
    10     // 一定要复位!!!不然会在按住旋转的时候会不断叠加rotation
    11     rec.rotation = 0;
    12 }
     
    Image(11)
     
    6.拖曳手势 UIPanGestureRecognizer
    相对始点拖曳距离:[pan translationInView:pan.view]
     1 - (void) testPan {
     2     UIPanGestureRecognizer *rec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRun:)];
     3    
     4     [self.hvwView addGestureRecognizer:rec];
     5 }
     6 
     7 - (void) panRun:(UIPanGestureRecognizer *) rec {
     8     // 取得拖曳距离
     9     CGPoint movedDistance = [rec translationInView:rec.view];
    10     CGPoint viewCenter = rec.view.center;
    11     viewCenter.x += movedDistance.x;
    12     viewCenter.y += movedDistance.y;
    13     rec.view.center = viewCenter;
    14    
    15     // 复位拖曳距离
    16     [rec setTranslation:CGPointZero inView:rec.view];
    17 }
     
     
    Image(12)
     
     
    B.一般情况只能使用一个识别器,使用代理设置才能同时使用多个识别器
    Image(13)
     
    1.遵守协议:
    1 @interface ViewController () <UIGestureRecognizerDelegate>
     
    2.给需要同时进行识别的手势识别器设置代理
    1 rec.delegate = self;
     
    3.实现手势识别器同时使用方法
    1 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    2    
    3     // 任何两种手势识别器都能同时使用
    4     return YES;
    5 }
     
      1 //
      2 //  ViewController.m
      3 //  GestureRecognizerTest
      4 //
      5 //  Created by hellovoidworld on 15/1/13.
      6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 
     11 @interface ViewController () <UIGestureRecognizerDelegate>
     12 
     13 @property (weak, nonatomic) IBOutlet UIView *hvwView;
     14 
     15 @end
     16 
     17 @implementation ViewController
     18 
     19 - (void)viewDidLoad {
     20     [super viewDidLoad];
     21     // Do any additional setup after loading the view, typically from a nib.
     22    
     23 //    [self testTap];
     24 //    [self testLongPress];
     25 //    [self testSwipe];
     26     [self testRotation];
     27     [self testPinch];
     28     [self testPan];
     29 }
     30 
     31 - (void) testTap {
     32     // 创建手势识别器
     33     UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRun:)];
     34     tapRec.numberOfTapsRequired = 3; // 触发需要点击的次数
     35     tapRec.numberOfTouchesRequired = 2; // 触发需要同时点击的点数目
     36    
     37     // 配置手势识别器到控件
     38     [self.hvwView addGestureRecognizer: tapRec];
     39 }
     40 
     41 /** tap手势的事件处理方法 */
     42 - (void) tapRun:(UITapGestureRecognizer *) tapRec {
     43     NSLog(@"tapRun");
     44 }
     45 
     46 - (void) testLongPress {
     47     UILongPressGestureRecognizer *longRec = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressRun:)];
     48    
     49     longRec.minimumPressDuration = 2; // 长按生效时间
     50     longRec.allowableMovement = 50; // 长按允许移动范围,单位:px
     51    
     52     [self.hvwView addGestureRecognizer:longRec];
     53 }
     54 
     55 - (void) longPressRun:(UILongPressGestureRecognizer *) rec {
     56     NSLog(@"longPress");
     57 }
     58 
     59 - (void) testSwipe {
     60     UISwipeGestureRecognizer *swipeRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRun:)];
     61     swipeRec.direction = UISwipeGestureRecognizerDirectionRight; // 轻扫的方向
     62    
     63     [self.hvwView addGestureRecognizer:swipeRec];
     64 }
     65 
     66 - (void) swipeRun:(UISwipeGestureRecognizer *) rec {
     67     NSLog(@"swipe");
     68 }
     69 
     70 - (void) testRotation {
     71     UIRotationGestureRecognizer *rotationRec = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationRun:)];
     72     rotationRec.delegate = self;
     73    
     74     [self.hvwView addGestureRecognizer:rotationRec];
     75 }
     76 
     77 - (void) rotationRun:(UIRotationGestureRecognizer *) rec {
     78     rec.view.transform = CGAffineTransformRotate(self.hvwView.transform, rec.rotation);
     79    
     80     // 一定要复位!!!不然会在按住旋转的时候会不断叠加rotation
     81     rec.rotation = 0;
     82 }
     83 
     84 - (void) testPinch {
     85     UIPinchGestureRecognizer *rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchRun:)];
     86     rec.delegate = self;
     87    
     88     [self.hvwView addGestureRecognizer:rec];
     89 }
     90 
     91 - (void) pinchRun:(UIPinchGestureRecognizer *) rec {
     92     rec.view.transform = CGAffineTransformScale(rec.view.transform, rec.scale, rec.scale);
     93    
     94     // 一定要复位!!!不然按住捏合会不断叠加倍数
     95     rec.scale = 1;
     96 }
     97 
     98 - (void) testPan {
     99     UIPanGestureRecognizer *rec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRun:)];
    100     rec.delegate = self;
    101    
    102     [self.hvwView addGestureRecognizer:rec];
    103 }
    104 
    105 - (void) panRun:(UIPanGestureRecognizer *) rec {
    106     // 取得拖曳距离
    107     CGPoint movedDistance = [rec translationInView:rec.view];
    108     CGPoint viewCenter = rec.view.center;
    109     viewCenter.x += movedDistance.x;
    110     viewCenter.y += movedDistance.y;
    111     rec.view.center = viewCenter;
    112    
    113     // 复位拖曳距离
    114     [rec setTranslation:CGPointZero inView:rec.view];
    115 }
    116 
    117 - (void)didReceiveMemoryWarning {
    118     [super didReceiveMemoryWarning];
    119     // Dispose of any resources that can be recreated.
    120 }
    121 
    122 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    123    
    124     // 任何两种手势识别器都能同时使用
    125     return YES;
    126 }
    127 
    128 @end
     
    #mark:
    因为使用的是transform形变进行缩放、旋转,所以再进行拖曳的时候是不能正常进行的。
  • 相关阅读:
    荣誉追记
    通过代码实现 Windows Mobile 窗体的最小化 (转)
    软件协会周年庆(高清晰)
    菜鸟级注册与限制
    Ajax Tree (转)
    转职场别做愤青
    菜鸟级分页用户控件
    Windows Mobile 常用键值(VK)对应表及系统文件夹简单介绍
    12.Linux软件包管理相关操作
    5.Docker应用
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4221452.html
Copyright © 2011-2022 走看看