iOS:手势UIGestureRecognizer使用

一、在Main.storyboard中拖入一个UIImageView,用于手势触发的View,并新加一个成员变量,建立连线:

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

二、实现手势的点击、长按、方向滑动、旋转、缩放、拖拽事件:

思路:

给View增加手势监听事件,传入自定义监听方法名称;

实现自定义方法,实现手势需要实现的功能,如缩放。

1.实现点击事件:

/*
 长按:增加事件(自定义方法)
 */
- (void) addLongPressAction{
    //监听长按事件,由自定义方法custemTouch接收
    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressView)];
    //长按几秒触发
    gesture.minimumPressDuration = 3;
    //在触发手势之前,指定px范围内长按有效
    gesture.allowableMovement = 100;
    //对此View增加事件
    [self.touchV addGestureRecognizer:gesture];
}
/*
 2.长按:接收事件(自定义方法)
 */
- (void) longPressView{
    NSLog(@"点击事件触发");
}

2.实现长按事件:

/*
 1.长按:增加事件(自定义方法)
 */
- (void) addLongPressAction{
    //监听长按事件,由自定义方法custemTouch接收
    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressView)];
    //长按几秒触发
    gesture.minimumPressDuration = 3;
    //在触发手势之前,指定px范围内长按有效
    gesture.allowableMovement = 100;
    //对此View增加事件
    [self.touchV addGestureRecognizer:gesture];
}
/*
 2.长按:接收事件(自定义方法)
 */
- (void) longPressView{
    NSLog(@"长按事件触发");
}

3.实现方向滑动事件:

/*
 1.方向滑动:增加事件(自定义方法)
 */
- (void) addDirectionAction{
    //监听长按事件,由自定义方法custemTouch接收
    UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slidingView)];
    //监听滑动方向事件,向上:UISwipeGestureRecognizerDirectionUp 向下:UISwipeGestureRecognizerDirectionDown 向左:UISwipeGestureRecognizerDirectionLeft 向右:UISwipeGestureRecognizerDirectionRight
    gesture.direction = UISwipeGestureRecognizerDirectionRight;
    //对此View增加事件
    [self.touchV addGestureRecognizer:gesture];
}
/*
 2.方向滑动:接收事件(自定义方法)
 */
- (void) slidingView{
    NSLog(@"方向滑动事件触发");
}

4.实现旋转事件:

/*
 1.旋转:增加事件(自定义方法):
 */
- (void) addRotaAction{
    //监旋转事件,由自定义方法rotaVie接收
    UIRotationGestureRecognizer *gesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotaVie:)];
    //实现手势代理,支持多种手势事件
    gesture.delegate = self;
    //对此View增加事件
    [self.touchV addGestureRecognizer:gesture];
}
/*
 2.旋转:接收事件(自定义方法)
 */
- (void) rotaVie:(UIRotationGestureRecognizer *)gesture {
    NSLog(@"旋转事件触发");
    //将手势的角度设置给触控的View,实现View的旋转
    gesture.view.transform = CGAffineTransformRotate(gesture.view.transform, gesture.rotation);
    //对手势的角度清0,保证旋转正常
    gesture.rotation = 0;
}

5.实现缩放事件:

/*
 1.缩放:增加事件(自定义方法):
 */
- (void) addScaleAction{
    //监缩放事件,由自定义方法scaleVie接收
    UIPinchGestureRecognizer *gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleVie:)];
    //实现手势代理,支持多种手势事件
    gesture.delegate = self;
    //对此View增加事件
    [self.touchV addGestureRecognizer:gesture];
}
/*
 2.缩放:接收事件(自定义方法)
 */
- (void) scaleVie:(UIPinchGestureRecognizer *)gesture {
    NSLog(@"缩放事件触发");
    //将手势的角度设置给触控的View,实现View的缩放
    gesture.view.transform = CGAffineTransformScale(gesture.view.transform, gesture.scale, gesture.scale);
    //对手势的缩放重置为1倍率,保证缩放正常
    gesture.scale = 1;
}

6.实现拖拽事件:

/*
 1.拖拽:增加事件(自定义方法):
 */
- (void) addDragAction{
    //监听拖拽事件,由自定义方法dragView接收
    UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragView:)];
    //实现手势代理,支持多种手势事件
    gesture.delegate = self;
    //对此View增加事件
    [self.touchV addGestureRecognizer:gesture];
}
/*
 2.拖拽:接收事件(自定义方法)
 */
- (void) dragView:(UIPanGestureRecognizer *)gesture {
    NSLog(@"拖拽事件触发");
    
    //获取当前手势状态,值:UIGestureRecognizerStateBegan(开始)、UIGestureRecognizerStateEnded(结束)等
//    gesture.state
    
    //获取View的拖动值
    CGPoint dragPoint = [gesture translationInView:gesture.view];
    
    /*
     改变View的中心点xy坐标值
     */
    CGPoint viewCenterPoint = gesture.view.center;
    viewCenterPoint.x += dragPoint.x;
    viewCenterPoint.y += dragPoint.y;
    gesture.view.center = viewCenterPoint;
    
    //重置移动距离,保证正常拖动
    [gesture setTranslation:CGPointZero inView:gesture.view];
}

三、重写代理的一些方法:

1.在自定义方法接收事件前拦截事件,需要重写gestureRecognizer-shouldReceiveTouch方法:

/*
 UIGestureRecognizerDelegate的方法:触摸时触发
 */
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"shouldReceiveTouch触发");
    //获取当前触控点的xy坐标
    CGPoint point = [touch locationInView:touch.view];
    return YES;
}

2.让UIView支持多种手势,接收多个事件,需要重写gestureRecognizer-shouldRecognizeSimultaneouslyWithGestureRecognizer方法:

/*
 UIGestureRecognizerDelegate的方法:重写,返回YES,支持多个手势同时触发,返回NO:不支持多个手势同时触发
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    NSLog(@"shouldRecognizeSimultaneouslyWithGestureRecognizer触发");
    return YES;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值