手势
手势是一种对触摸事件的封装
它是有规律的触摸事件的集合.
每一个手势必须被一个对象所接受.同时,每一个手势只能被特定类型的对象所接受.
你不能在屏幕上tap一下,然后指望用捏合的对象去接受.
如果你轻拍了一下屏幕,但是却没有用轻拍的了类去检测, 那么,这次算是白拍了.
ios中将所有的手势分为7种:
轻拍:UITapGestureRecognizer
长按:UILongPressGestureRecognizer
旋转:UIRotationGestureRecognizer
捏合:UIPinchGestureRecognizer
平移:UIPanGestureRecognizer
轻扫:UISwipeGestureRecognizer
屏幕边缘拉出:UIScreenEdgePanGestureRecognizer
他们叫:手势识别器,也就是说,你得设置他们,他们才能去检测屏幕.
下面详细说一下:
7种手势:(总看成自拍…)
轻拍手势识别器:UITapGestureRecognizer
"// 实例化方法
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAciont:)];"
"// 手势必须挂载到视图上
[self.rv.myImageView addGestureRecognizer:tap]; //注意这里,self.rv.myImageView不一定要挂在图片上,所有的view都可以挂.你这么写,这样就是检测这张图片的.其他视图没有检测."
"// 轻拍次数:
tap.numberOfTapsRequired = 1; //注意,是拍几次才被检测到!如果拍的次数小于这个值,白拍."
"// n点触控触发 与上同.
tap.numberOfTouchesRequired = 1; "
长按手势识别器
UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
[self.rv.myImageView addGestureRecognizer:longPress];
"// 长按时间间隔,按的时间小于这个间隔,不会被检测到手势.
longPress.minimumPressDuration = 2;"
旋转手势识别器
UIRotationGestureRecognizer * rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
[self.rv.myImageView addGestureRecognizer:rotation];
"旋转的处理方法:里面用到了一个能让视图发生旋转的方法.
- (void)rotationAction:(UIRotationGestureRecognizer *)sender
{
sender.view.transform = CGAffineTransformRotate(sender.view.transform, sender.rotation); //这里面的参数是死的,我有点不明白,但是你这么写它就转.
sender.rotation = 0; // 每次转完,角度清零.否则越转越快.
}"
这个没有时间和n点触控的概念.
捏合手势识别器
"UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];
[self.rv.myImageView addGestureRecognizer:pinch];"
"// 捏合的处理方法,不知道为啥,他就是能放大缩小.
- (void)pinchAction:(UIPinchGestureRecognizer *)sender
{
sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
sender.scale = 1;
}
"
平移手势识别器
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[self.rv.myImageView addGestureRecognizer:pan];
"// 平移处理方法,是不是比触摸事件简单多了?
-(void) panAction:(UIPanGestureRecognizer *)sender
{
// 获取移动坐标
CGPoint point = [sender translationInView:sender.view];
// 设置移动动作.
sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, point.y);
// 偏移量归零
[sender setTranslation:CGPointZero inView:sender.view ];
}"
轻扫手势识别器
清扫手势需要你设置4个不同的方向的检测器.
UISwipeGestureRecognizer * leftswip = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipAction:)];
[self.rv.myImageView addGestureRecognizer:leftswip];
leftswip.numberOfTouchesRequired = 1;
leftswip.direction = UISwipeGestureRecognizerDirectionLeft ;
UISwipeGestureRecognizer * rightswip = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipAction:)];
[self.rv.myImageView addGestureRecognizer:rightswip];
rightswip.numberOfTouchesRequired = 1;
rightswip.direction = UISwipeGestureRecognizerDirectionRight ;
"// 轻扫识别,通过sender(这个手势检测器的传入对象)的direction(方向)来区分不同的轻扫.
- (void)swipAction:(UISwipeGestureRecognizer *)sender
{
//NSLog(@""轻扫"");
if (sender.direction == UISwipeGestureRecognizerDirectionDown) {
NSLog(@""向下轻扫"");
}
if (sender.direction == UISwipeGestureRecognizerDirectionUp) {
NSLog(@""向上轻扫"");
}
if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {
NSLog(@""向左轻扫"");
}
if (sender.direction == UISwipeGestureRecognizerDirectionRight) {
NSLog(@""向右轻扫"");
}
}"
屏幕边缘识别器
这个和轻扫一样,同样需要你提供四个方向的检测,用一个检测器无法实现.
UIScreenEdgePanGestureRecognizer * edge = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
edge.edges = UIRectEdgeRight;
edge.delegate = self ;
[self.rv addGestureRecognizer:edge];