你的位置:首页 > 操作系统

[操作系统]iOS开发小功能之八:手势的简单使用(6种)以及代理方法


代码:

 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 *)pinch103 {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)setUpPan116 {117   UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];118   [self.imageView addGestureRecognizer:pan];119 }120 - (void)pan:(UIPanGestureRecognizer *)pan121 {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 *)touch15 {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 }