本文主要介绍了IOS的七种手势(拖动、捏合、旋转、点击、长按、滑动、自定义)的详细说明以及示例代码的相关信息。有需要的可以参考一下。
IOS 七种手势操作
今天为大家介绍一下IOS 的七种手势,手势在开发中经常用到,所以就简单 通俗易懂的说下, 话不多说,直接看代码:
1、UIGestureRecognizer 介绍
手势识别在iOS中非常重要,大大提高了移动设备的便利性。
iOS 3.2以后提供了一些常用的手势(UIGestureRecognizer的子类),开发者可以直接使用它们进行手势操作。
UIPanGestureRecognizer(拖动)
UIPinchGestureRecognizer(揉捏)
UIRotationGestureRecognizer(旋转)
UITapGestureRecognizer(单击)
UILongPressGestureRecognizer(长按)
UISwipeGestureRecognizer(滑动)
此外,您可以通过继承UIGestureRecognizer类来实现自定义手势(手势识别器类)。
PS:自定义手势时需要# importuikit/uigesturecognizersublic . h,一般需要实现以下方法:
- (void)复位;
-(void)touches begin:(ns set *)touches with event:(ui event *)事件;
-(void)touchesMoved:(ns set *)touches withEvent:(ui event *)事件;
-(void)touchesEnded:(ns set *)touches with event:(ui event *)事件;
-(void)touches cancelled:(ns set *)touches withEvent:(ui event *)事件;
//上述方法在分类UIgestureCognizer(UIgestureCognized)中声明。请检查更多的方法声明。
UIGestureRecognizer 的继承关系如下:
2、手势状态
在六种手势识别中,只有一种手势是离散手势,即UITapGestureRecognizer。
离散手势的特点是一旦识别就不能取消,只会调用一个手势操作事件(手势初始化时指定的回调方法)。
换句话说,其他五种手势都是连续手势,连续手势的特点是可以多次调用手势操作事件,连续手势识别后可以取消。从下图可以看出,对操作事件的调用次数是不同的:
手势状态枚举如下:
typedef NS_ENUM(NSInteger,UIGestureRecognizerState) {
GestureCognizerStateaccessible,//没有识别出什么手势操作(但可能已经触发了触摸事件),默认状态
GestureCognizerStateebegan,//手势已经开始,此时已被识别,但可能在过程中发生变化,手势操作尚未完成。
GestureCognizerStateChanged,//手势状态改变。
GestureCognizerStatened,//手势识别操作完成(此时手指已经松开)
GestureCognizerStateCanceled,//手势被取消并返回到默认状态。
GestureCognizerStatefeiled,//手势识别失败,返回默认状态。
UigestureCognizerStatened=UigestureCognizerStatened//手势识别完成,与UigestureCognizerStatened相同。
};
对于离散手势UITapGestureRecgnizer,它要么被识别,要么失败。点击(假设点击次数设置为1,没有添加长按手势)一次,那么此时什么都不会发生。松开手指立即识别并调用操作事件,状态为3(已完成)。
但是,连续手势更复杂。以旋转手势为例。如果两个手指什么都不做就向下点击,此时手势无法识别(因为我们还没有旋转),但触摸开始事件实际上已经被触发,此时处于状态0;如果此时会识别到旋转,则调用相应的操作事件,状态变为1(手势开始),但状态1只是一瞬间;然后状态变为2(因为我们的轮换需要持续一段时间),操作事件被重复调用(如果事件中打印了状态,则重复打印2);松开手指,状态变成3,操作事件调用一次。
3、使用手势的步骤
手势使用简单,可分为三个步骤:
创建手势识别器对象的实例。创建时,指定一个回调方法,并在手势开始、更改或结束时执行回调方法。
设置笔势识别器对象实例的相关属性(可选部分)
添加到需要识别的视角中。每个手势只对应一个查看,当屏幕触摸在视角的边界内时,如果手势和预定的一样,那就会执行回调方法。
PS:一个手势只能对应一个查看,但是一个视角可以有多个手势。建议在真机上测试这些手势,模拟器操作不太方便,可能导致认为手势失效的情况。(模拟器测试捏合和旋转手势时,按住选择权键,再用触摸板或鼠标操作)
4、举例说明
功能描述:
附加到两个图片视图UIImageView的有『拖动』、『捏合』、『旋转』、『点按』;
而『轻扫』和『自定义手势KMGestureRecognizer】附加在根视图UIView中。
拖动:进行当前图片视图位置移动
捏合:进行当前图片视图缩放
旋转:进行当前图片视图角度旋转
点按:双击恢复当前图片视图的缩放、角度旋转、不透明度
长按:设置当前图片视图的不透明度为0.7
轻扫:左右轻扫设置两个图片视图为居中,同时以垂直居中的特定偏移量定位
自定义手势:挠痒功能,左右扫动共3次或以上,设置两个图片视图为居中,同时以水平居中的特定偏移量定位
效果如下:
KMGestureRecognizer.h
#导入UIKit/UIKit.h
typedef NS_ENUM(NSUInteger,Direction) {
方向未知,
方向左,
方向正确
};
@ interface KMGestureRecognizer:UIGestureRecognizer
@property (assign,非原子)nsu整数刻度计数;//挠痒次数
@property (assign,nonatomic)CG点currentTickleStart//当前挠痒开始坐标位置
@property (assign,nonatomic)Direction最后一个方向;//最后一次挠痒方向
@end
KMGestureRecognizer.m
#import KMGestureRecognizer.h
#导入ui工具包/uigesturerecognizersublic。h
@ implementation KMGestureRecognizer
#定义kMinTickleSpacing 20.0
#定义kMaxTickleCount 3
-(无效)重置{
_ tickle计数=0;
_ currentTickleStart=CGPointZero;
_ last direction=方向未知;
如果(自我。state==uigesturerecognizerstateuble){
自我。state=UIGestureRecognizerStateFailed;
}
}
-(void)触摸开始:(ns set *)触摸事件:(ui event *)事件{
ui touch * touch=[触摸任何对象];
_ currentTickleStart=[触摸视图中的位置:自身。查看];//设置当前挠痒开始坐标位置
}
-(void)触摸移动:(ns set *)触摸事件:(ui event *)事件{
//『当前挠痒开始坐标位置』和『移动后坐标位置』进行X轴值比较,得到是向左还是向右移动
ui touch * touch=[触摸任何对象];
CG点tickle end=[视图中的触摸位置:自我。查看];
CG浮动辅助间距=辅助结束。x-_ currentticklestart。x;
方向电流方向=挠间距0?方向左:方向右;
//移动的X轴间距值是否符合要求,足够大
if(ABS(tickle spacing)=kMinTickleSpacing){
//判断是否有三次不同方向的动作,如果有则手势结束,将执行回调方法
if(_最后方向==未知方向| |
(_ last direction==direction left当前方向==direction right)| |
(_ last direction==direction right当前方向==direction left)){
_ tickleCount
_ currentTickleStart=tickleEnd
_lastDirection=当前方向;
if(_胳肢计数=kmax胳肢计数自我。state==uigesturerecognizerstateuble){
自我。state=UIGestureRecognizerStateEnded;
//NSLog(@ 自定义手势成功,将执行回调方法);
}
}
}
}
-(void)touchesEnded:(ns set *)touches with event:(ui event *)event {
[自复位];
}
-(void)触摸取消:(ns set *)触摸事件:(ui event *)事件{
[自复位];
}
@end
ViewController.h
#导入UIKit/UIKit.h
#import KMGestureRecognizer.h
@界面视图控制器:uiview控制器
@property (h3,非原子)UIImageView * imgV
@property (h3,非原子)UIImageView * imgV2
@property (h3,非原子)KMGestureRecognizer * customGestureRecognizer;
@end
ViewController.m
#导入ViewController.h
@interface ViewController()
-(void)手柄平移:(UIPanGestureRecognizer *)识别器;
-(void)手柄收缩:(UIPinchGestureRecognizer *)识别器;
-(void)句柄旋转:(UIRotationGestureRecognizer *)识别器;
-(void)手柄点击:(UITapGestureRecognizer *)识别器;
-(void)handleLongPress:(UILongPressGestureRecognizer *)识别器;
-(void)手柄滑动:(UISwipeGestureRecognizer *)识别器;
-(void)handleCustomGestureRecognizer:(KMGestureRecognizer *)识别器;
-(void)bind pan:(UIImageView *)imgVCustom;
-(void)bind pinch:(UIImageView *)imgVCustom;
-(void)绑定旋转:(UIImageView *)imgVCustom;
-(void)bind tap:(UIImageView *)imgVCustom;
-(void)bindlonpress:(UIImageView *)imgVCustom;
-(void)绑定刷卡;
-(void)bingCustomGestureRecognizer;
-(void)布局ui;
@end
@实现视图控制器
- (void)viewDidLoad {
【超级viewDidLoad】;
【自我布局推】;
}
-(void)didReceiveMemoryWarning {
【超级didReceiveMemoryWarning】;
//释放任何可以重新创建的资源。
}
#杂注标记-处理手势操作
/**
* 处理拖动手势
*
* @param识别器拖动手势识别器对象实例
*/
-(void)手柄平移:(UIPanGestureRecognizer *)识别器{
//视图前置操作
[识别器。查看。超级视图bringSubviewToFront:recognizer。查看];
CG点中心=识别器。查看。居中;
CG浮动角半径=识别器。查看。框架。尺寸。宽度/2;
CG点平移=【识别器平移视图:自身。查看];
//NSLog(@%@ ,NSStringFromCGPoint(translation));
识别器。查看。center=CGPointMake(center。x翻译。x,居中。y翻译。y);
[识别器集转换:视图中的CGPointZero:self。查看];
如果(识别器。state==UIGestureRecognizerStateEnded){
//计算速度向量的长度,当他小于200时,滑行会很短
重心点速度=[视图中的识别器速度:自身。查看];
CGFloat星等=sqrtf((速度。x *速度。x)(速度。y *速度。y));
CGFloat slideMult=星等/200;
//NSLog(@magnitude: %f,slideMult: %f ,magnitude,slide mult);//例如397.973175,滑动乘数:1.989866
//基于速度和速度因素计算一个终点
浮动滑动因子=0.1 *滑动倍数;
CG点终点=CGPointMake(中心。x(速度。x *滑动因子),
居中。y(速度。y *滑动因子));
//限制最小[圆角半径]和最大边界值【自我。查看。界限。尺寸。宽度-拐角半径],以免拖动出屏幕界限
最后一点。x=最小(最大(终点。x,cornerRadius),
自我。查看。界限。尺寸。宽度-拐角半径);
最后一点。y=最小(最大(终点。y,cornerRadius),
自我。查看。界限。尺寸。高度-拐角半径);
//使用UIView动画使视角滑行到终点
[ui视图动画宽度持续时间:滑动系数* 2
延迟:0
选项:uiviewnanimationoptioncurveeaseout
animations:^{
识别器。查看。中心=终点;
}
完成:无];
}
}
/**
* 处理捏合手势
*
* @param识别器捏合手势识别器对象实例
*/
-(void)手柄收缩:(UIPinchGestureRecognizer *)识别器{
CGFloat scale=recognizer.scale
识别器。查看。transform=cgaffinitetransformScale(识别器。查看。变换、缩放、缩放);//在已缩放大小基础下进行累加变化;区别于:使用CGAffineTransformMakeScale方法就是在原大小基础下进行变化
recognizer.scale=1.0
}
/**
* 处理旋转手势
*
* @param识别器旋转手势识别器对象实例
*/
-(void)句柄旋转:(UIRotationGestureRecognizer *)识别器{
识别器。查看。transform=cgaffinitetransformrotate(识别器。查看。转换,识别器。旋转);
recognizer.rotation=0.0
}
/**
* 处理点按手势
*
* @param识别器点按手势识别器对象实例
*/
-(void)手柄点击:(UITapGestureRecognizer *)识别器{
UIView * view=recognizer.view
查看。transform=cgaffinitetransformmakescale(1.0,1.0);
查看。transform=cgaffinitetransformmakerosion(0.0);
视图=1.0
}
/**
* 处理长按手势
*
* @param识别器点按手势识别器对象实例
*/
-(void)handleLongPress:(UILongPressGestureRecognizer *)识别器{
//长按的时候,设置不透明度为0.7
识别器。查看。=0.7;
}
/**
* 处理轻扫手势
*
* @param识别器轻扫手势识别器对象实例
*/
-(void)手柄滑动:(UISwipeGestureRecognizer *)识别器{
//代码块方式封装操作方法
void(^positionoperation)()=^(){
新点=识别器。查看。居中;
新观点。y-=20.0;
_ imgV.center=newPoint
newPoint.y=40.0
_ img v2。中心=新点;
};
//根据轻扫方向,进行不同控制
开关(识别器。方向){
大小写UISwipeGestureRecognizerDirectionRight:{
位置操作();
打破;
}
大小写UISwipeGestureRecognizerDirectionLeft:{
位置操作();
打破;
}
大小写UISwipeGestureRecognizerDirectionUp:{
打破;
}
大小写UISwipeGestureRecognizerDirectionDown:{
打破;
}
}
}
/**
* 处理自定义手势
*
* @param识别器自定义手势识别器对象实例
*/
-(void)handleCustomGestureRecognizer:(KMGestureRecognizer *)recognizer {
//代码块方式封装操作方法
void(^positionoperation)()=^(){
新点=识别器。查看。居中;
新观点。x-=20.0;
_ imgV.center=newPoint
newPoint.x=40.0
_ img v2。中心=新点;
};
位置操作();
}
#杂注标记-绑定手势操作
/**
* 绑定拖动手势
*
* @param imgVCustom绑定到图片视图对象实例
*/
-(void)绑定平移:(ui图像视图*)imgVCustom {
UIPanGestureRecognizer * recognizer=[[UIPanGestureRecognizer alloc]initWithTarget:self
动作:@选择器(手柄平移:)];
[imgVCustom addGestureRecognizer:recognizer];
}
/**
* 绑定捏合手势
*
* @param imgVCustom绑定到图片视图对象实例
*/
-(void)bind pinch:(ui图像视图*)imgVCustom {
UIPinchGestureRecognizer * recognizer=[[UIPinchGestureRecognizer alloc]initWithTarget:self
动作:@选择器(手柄捏:)];
[imgVCustom addGestureRecognizer:recognizer];
//[recognizer requiremesturerecognizertofail:imgv custom。手势识别器。第一个对象];
}
/**
* 绑定旋转手势
*
* @param imgVCustom绑定到图片视图对象实例
*/
-(void)绑定旋转:(ui图像视图*)imgVCustom {
UIRotationGestureRecognizer * recognizer=[[UIRotationGestureRecognizer alloc]initWithTarget:self
动作:@选择器(手柄旋转:)];
[imgVCustom addGestureRecognizer:recognizer];
}
/**
* 绑定点按手势
*
* @param imgVCustom绑定到图片视图对象实例
*/
-(void)绑定点击:(ui图像视图*)imgVCustom {
UITapGestureRecognizer * recognizer=[[UITapGestureRecognizer alloc]initWithTarget:self
操作:@选择器(手柄轻敲:)];
//使用一根手指双击时,才触发点按手势识别器
识别器。numberoftapsrequired=2;
识别器。numberoftouchesrequired=1;
[imgVCustom addGestureRecognizer:recognizer];
}
/**
* 绑定长按手势
*
* @param imgVCustom绑定到图片视图对象实例
*/
-(void)bindlonpress:(ui imageview *)imgVCustom {
UILongPressGestureRecognizer * recognizer=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@ selector(handleLongPress:)];
识别器。minimumpressduration=0.5//设置最小长按时间;默认为0.5秒
[imgVCustom addGestureRecognizer:recognizer];
}
/**
* 绑定轻扫手势;支持四个方向的轻扫,但是不同的方向要分别定义轻扫手势
*/
- (void)bindSwipe {
//向右轻扫手势
UISwipeGestureRecognizer * recognizer=[[UISwipeGestureRecognizer alloc]initWithTarget:self
操作:@选择器(手柄滑动:)];
识别器。direction=UISwipeGestureRecognizerDirectionRight;//设置轻扫方向;默认是UISwipeGestureRecognizerDirectionRight,即向右轻扫
【自我。查看addGestureRecognizer:recognizer];
[recognizer requireGestureRecognizerToFail:_ customGestureRecognizer];//设置以自定义挠痒手势优先识别
//向左轻扫手势
recognizer=[[UISwipeGestureRecognizer alloc]initWithTarget:self
操作:@选择器(手柄滑动:)];
识别器。direction=UISwipeGestureRecognizerDirectionLeft;
【自我。查看addGestureRecognizer:recognizer];
[recognizer requireGestureRecognizerToFail:_ customGestureRecognizer];//设置以自定义挠痒手势优先识别
}
/**
* 绑定自定义挠痒手势;判断是否有三次不同方向的动作,如果有则手势结束,将执行回调方法
*/
-(void)bingCustomGestureRecognizer {
//当识别器。状态为UIGestureRecognizerStateEnded时,才执行回调方法handleCustomGestureRecognizer:
//_ customGestureRecognizer=[KMGestureRecognizer new];
_ customGestureRecognizer=[[KMGestureRecognizer alloc]initWithTarget:self
操作:@ selector(handleCustomGestureRecognizer:)];
【自我。查看addGestureRecognizer:_ customGestureRecognizer];
}
-(无效)布局推{
//图片视图_imgV
ui image * img=[ui image image name:@ emotion _ Tusi Ji _ icon ];
重心浮动角半径=img。尺寸。宽度;
_ imgV=[[ui image view alloc]init with image:img];
_imgV.frame=CGRectMake(20.0,20.0,
拐角半径* 2,拐角半径* 2);
_ imgv。启用用户交互=是;
_ imgv。层。maskstobounds=YES
_ imgv。层。拐角半径=拐角半径;
_ imgv。层。边框宽度=2.0;
_ imgv。层。边框颜色=[用户界面颜色灰色]。CGColor
【自我。查看addSubview:_ imgV];
//图片视图_imgV2
img=[ui image image named:@ emotion _ Tusi Ji _ icon 2 ];
拐角半径=img。尺寸。宽度;
_ img v2=[[ui image view alloc]init with image:img];
_imgV2.frame=CGRectMake(20.0,40.0 _imgV.frame.size.height,
拐角半径* 2,拐角半径* 2);
_ img v2。启用用户交互=是;
_ img v2。层。maskstobounds=YES
_ img v2。层。拐角半径=拐角半径;
_ img v2。层。边框宽度=2.0;
_ img v2。层。边框颜色=[ui颜色橙色].CGColor
【自我。查看addSubview:_ img v2];
[自绑定pan:_ imgV];
[自绑定捏:_ imgV];
[自绑定旋转:_ imgV];
[自绑定抽头:_ imgV];
[self bindlonpress:_ imgV];
[自绑定pan:_ img v2];
[自绑定捏:_ img v2];
[自绑定旋转:_ img v2];
[自绑定tap:_ img v2];
[self bindlonpress:_ img v2];
//为了处理手势识别优先级的问题,这里需先绑定自定义挠痒手势
[self bingCustomGestureRecognizer];
【自绑定刷卡】;
}
@end
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!