一、在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;
}