手势分为:单击、轻扫、长按、旋转、拖拽、捏合六种,下面就一一给大家说说这六种手势的一些使用方法。
准备工作:先创建一个UIImageView(创建的对象叫做:imageView),方便下面手势的操作。
一、单击手势:UITapGestureRecognizer
- numberOfTapsRequired //点击多少次调用单击的方法
- numberOfTouchesRequired //多少个手指单击才会调用单击的方法
以单击手势为例子,以下手势都按这个套路出牌。
步骤一:创建对应的手势
步骤二:设置手势的属性
步骤三:把手势加入到对应的UIImageView里面去
//单击手势,@selector()是单击后会调用的方法
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onClickControlWithTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
[imageView addGestureRecognizer:tap]
二、轻扫手势:UISwipeRecognizer
- direction//设置轻扫的方向,默认是向右
PS:这里有个坑,如果需要设置多个轻扫方向的话,会用位运算来设置多个方向,这样是不行的。
解决办法:创建多个轻扫手势对象,然后每个轻扫对象设置不同的轻扫方向,然后都加入UIImageView中。
//轻扫手势
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onClickControlWithSwipe:)];
//允许轻扫的方法(PS:如果这里用分隔符来存放多个方向手势,会出现错误的效果,可以创建多个轻扫手势,然后这些轻扫手势设置不同的轻扫方向,然后全部加入imageView中)
swipe.direction = UISwipeGestureRecognizerDirectionRight;
swipe.delegate = self;
[imageView addGestureRecognizer:swipe];
UISwipeGestureRecognizer *swipe1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onClickControlWithSwipe:)];
swipe.direction = UISwipeGestureRecognizerDirectionLeft;
[imageView addGestureRecognizer:swipe1];
三、长按手势:UILongPressRecognizer
- numberOfTouchesRequired//多少个手指按下触发事件
- minimumPressDuration//按下多少秒后触发事件
allowableMovement//手指按下后事件响应之前允许手指移动的偏移量
四、旋转手势:UIRotationRecognizer
/**旋转事件*/
-(void)onClickControlWithRotation:(UIRotationGestureRecognizer *)rotation
{
if (self.btn_pat.alpha == 1) {
rotation.view.transform = CGAffineTransformRotate(rotation.view.transform, rotation.rotation);
//注意,这里每次旋转后都让旋转弧度归零
/*
因为每次旋转,rotation.rotatin都是累加的
比如说:从0开始旋转,第一次旋转了1,那么结果应该是0+1=1 此时rotation.rotatin = 1
然后再旋转1,那么就是0+1+1,结果应该是2 但是!此时rotation.rotatin = 2(因为是累加的,他是相对于原点移动了2)
这个时候就会产生错误的结果 产生错误结果原因:0+1+2=3 所以就会越转越快了,因为结果错误
解决办法:每次旋转后,让rotation.rotatin归零,不需要他给我累加,移动1就变1
*/
rotation.rotation = 0;
}
}
五、拖拽手势:UIPanGestureRecognizer
/**拖拽事件*/
-(void)onClickControlWithPan:(UIPanGestureRecognizer *)pan
{
if (self.btn_pat.alpha == 0) {
CGPoint point = [pan translationInView:pan.view];
CGPoint temp = pan.view.center;
temp.x += point.x;
temp.y += point.y;
pan.view.center = temp;
//和旋转、捏合一样的原理
[pan setTranslation:CGPointZero inView:pan.view];
}
}
六、捏合手势:UIPinchGestureRecognizer
/**捏合事件*/
-(void)onClickControlWithPinch:(UIPinchGestureRecognizer *)pinch
{
pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
/*
和旋转一样的原理,如果不把捏合程度每次都变为1,也会累乘
*/
pinch.scale = 1.0;
}
综合了6种手势,我做了一个简单的手势例子。
只是我一个脑洞打开的作品而已,小白资历尚浅,还没入门,忘大家轻点喷哦~~~
里面有两个UIImageView:
- 长按的时候可以让图片360度旋转,再次长按使图片停止旋转
- 单击的时候可以让图片放大
- 图片放大后,再次点击能让图片回到原来位置(程序有bug,小白资历浅,改不动了,但是变形的图片也能恢复到原状)
- 图片在原来形状时候,不能捏合图片,只能拖拽、放大、旋转图片
- 在图片原来形状的时候,旋转图片后最好不要拖拽图片,因为此时拖拽效果有问题(又是一个bug,又改不动...)
参考代码:https://github.com/HZhenF/GestureRecognizer.git