IOS 七种手势操作 拖动、捏合、旋转、点按、长按、轻扫、自定义详解及实例代码

IOS 七种手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)详解及实例代码

本文主要介绍了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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

IOS 七种手势操作 拖动、捏合、旋转、点按、长按、轻扫、自定义详解及实例代码