在iOS设备中常用的手势有:Tap(点击),Long Press(长按),Pan(拖动),Swipe(滑动),Rotation(旋转),Pinch(手指的合拢和张开)
在iOS设备上识别手势的有2种实现方式:手势识别器(UIGestureRecognizer)和触摸事件(UITouch)
手势的识别状态
对于视图对象,主要有2个属性
userInteractionEnabled 开启或关闭用户事件
multipleTouchEnabled 设置是否接受多点触摸事件
UIGestureRecognizerStatePossible 手势尚未识别,默认状态
UIGestureRecognizerStateBegan开始接收连续类型手势
UIGestureRecognizerStateChanged接受连续类型手势状态变化
UIGestureRecognizerStateEnded结束接收连续类型手势
UIGestureRecognizerStateCancelled取消接收连续类型手势
UIGestureRecognizerStateFailed离散类型手势识别失败
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded离散类型手势识别成功
连续类型的手势是由默认状态到识别状态,再到changed状态,其中changed状态可能会多次变化,最后有结束和取消2中状态.
离散手势只有2中状态,一种是识别,一种是取消.
通过XIB的方式添加手势,之前一直没有注意 其实xcode是可以通过xib或者storyboard添加手势,只需要选择你想要的就可以了
注意需要添加到你想要的视图,如果是view里的某个视图,则要添加到那个视图里,添加以后会有一个这样的选项多出来
右键拖到程序里,就可以设置action,然后触发你想要的方法了
还需要注意的是
例如:单击
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">tapRecognizer.numberOfTapsRequired=1; tapRecognizer.numberOfTouchesRequired=1;</span></span></span>
其中taps是触发点击次数,touches是触发手指个数
长按
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">recognizer.allowableMovement = 100.0f; recognizer.minimumPressDuration = 0.5;</span></span></span>
allowableMovement为设置手势被识别之前,最小移动的距离,单位是points
minimumPressDuration设置手势识别的最短持续时间,单位是秒(不知道为什么在设置这个属性用代码的时候,超过0.5s就会失效,点进去看注释说默认就是0.5s,但是xib则可以设置成1s,不知道是为什么...)
拖动
代表最大和最小的触点个数
滑动
如果想判断四个方向的滑动的话,其实应该添加4个手势,下面写一下需要注意的参数
recognizer.direction设置识别手势的方向,分为上下左右
<span style="font-size:18px;"><span style="font-size:18px;">typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) { UISwipeGestureRecognizerDirectionRight = 1 << 0, UISwipeGestureRecognizerDirectionLeft = 1 << 1, UISwipeGestureRecognizerDirectionUp = 1 << 2, UISwipeGestureRecognizerDirectionDown = 1 << 3 };</span></span>
recognizer.numberOfTouchesRequired =1;
识别手指的个数
<span style="font-size:18px;"><span style="font-size:18px;">- (void) foundTap:(UISwipeGestureRecognizer*)paramSender{ NSLog(@"paramSender.direction = %i",paramSender.direction); if (paramSender.direction == UISwipeGestureRecognizerDirectionDown){ NSLog(@"向下滑动"); } if (paramSender.direction == UISwipeGestureRecognizerDirectionLeft){ NSLog(@"向左滑动"); } if (paramSender.direction == UISwipeGestureRecognizerDirectionRight){ NSLog(@"向右滑动"); } if (paramSender.direction == UISwipeGestureRecognizerDirectionUp){ NSLog(@"向上滑动"); } }</span></span>
旋转
<span style="font-size:18px;">/* 上一次角度加上本次旋转的角度 */ self.imageView.transform = CGAffineTransformMakeRotation(rotationAngleInRadians + paramSender.rotation); /* 手势识别完成,保存旋转的角度 */ if (paramSender.state == UIGestureRecognizerStateEnded){ rotationAngleInRadians += paramSender.rotation; }</span>
缩放
<span style="font-size:18px;"> if (paramSender.state == UIGestureRecognizerStateEnded){ currentScale = paramSender.scale; } else if (paramSender.state == UIGestureRecognizerStateBegan && currentScale != 0.0f){ paramSender.scale = currentScale; } self.imageView.transform = CGAffineTransformMakeScale(paramSender.scale, paramSender.scale); </span>