首页 >> 精选知识 >

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

2023-05-31 16:08:33 来源: 用户: 

大家好,综合小编来为大家讲解下IOS,七种手势操作,拖动、捏合、旋转、点按、长按、轻扫、自定义详解及实例代码这个很多人还不知道,现在让我们一起来看看吧!

今天我要给大家介绍的是IOS的七种手势。手势在开发中经常用到,我们就简单易懂一点,不多说,只看代码:

1、UIGestureRecognizer介绍

[资料图]

手势识别在iOS中非常重要,大大提高了移动设备的便利性。

3.2以后,iOS系统提供了一些常用的手势(UIGestureRecognizer的一个子类),开发者可以直接使用这些手势进行手势操作。

UIPanGestureRecognizer(拖动)UIPinchGestureRecognizer(捏合)UIRotationGestureRecognizer(旋转)UITapGestureRecognizer(点按)UILongPressGestureRecognizer(长按)UISwipeGestureRecognizer(轻扫)另外,

PS:自定义手势时需要# importuikit/uigesturecognizersublic . h,一般需要实现以下方法:

-(无效)复位;-(void)触摸开始:(ns set *)触摸事件:(ui event *)事件;-(void)touches moved:(ns set *)touches with event:(ui event *)事件;-(void)touchesEnded:(ns set *)touches with event:(ui event *)事件;-(void)触摸取消:(ns set *)触摸withEvent:(ui event *)事件;//以上方法在分类UIGestureRecognizer(UIGestureRecognizerProtected)中声明,

2.手势状态

在六种手势识别中,只有一种手势是离散手势,它就是UITapGestureRecognizer。

离散手势的特点是:一旦识别就不能取消,只会调用一个手势操作事件(初始化手势时指定的回调方法)。

换句话说,其他五种手势都是连续手势,连续手势的特点是:手势操作事件会被多次调用,连续手势识别后可以取消手势。从下图可以看出,它们调用操作事件的次数是不同的:

手势状态列举如下:

typedef NS_ENUM(NSInteger,UIGestureRecognizerState){ uigesturerecognizerstateuble,//尚未识别是何种手势操作(但可能已经触发了触摸事件),

但是,连续手势更复杂。以旋转手势为例。如果两个手指向下点击,什么都不做,此时手势无法识别(因为我们还没有旋转),但触摸开始事件实际上已经被触发,处于状态0;如果此时识别出旋转,

会调用相应的操作事件,状态会变成1(手势开始),但状态1只是一瞬间;然后状态变为2(因为我们的旋转需要持续一段时间),重复调用操作事件(如果事件中打印了状态,则重复打印2);放开你的手指,

此时状态变为3,操作事件被调用一次。

3.使用手势的步骤

使用手势很简单,分为三个步骤:

创建手势识别器对象的实例。创建时,指定一个回调方法,并在手势开始、更改或结束时执行回调方法。设置手势识别器对象实例(可选部分)的相关属性,并将其添加到要识别的视图中。

每个手势只对应一个视图。当屏幕在视图的边界内触摸时,如果手势与预定的相同,将执行回调方法。PS:一个手势只能对应一个视图,但是一个视图可以有多个手势。

建议在真机上测试这些手势,模拟器操作不太方便,可能导致认为手势失效的情况。(模拟器测试捏合和旋转手势时,按住option 键,再用触摸板或鼠标操作)

4、举例说明

功能描述:

附加到两个图片视图UIImageView 的有『拖动』、『捏合』、『旋转』、『点按』;

而『轻扫』和『自定义手势KMGestureRecognizer』附加在根视图UIView 中。

拖动:进行当前图片视图位置移动

捏合:进行当前图片视图缩放

旋转:进行当前图片视图角度旋转

点按:双击恢复当前图片视图的缩放、角度旋转、不透明度

长按:设置当前图片视图的不透明度为0.7

轻扫:左右轻扫设置两个图片视图为居中,同时以垂直居中的特定偏移量定位

自定义手势:挠痒功能,左右扫动共3次或以上,设置两个图片视图为居中,同时以水平居中的特定偏移量定位

效果如下:

KMGestureRecognizer.h

#import UIKit/UIKit.htypedef NS_ENUM(NSUInteger, Direction) { DirectionUnknown, DirectionLeft, DirectionRight};@interface KMGestureRecognizer : UIGestureRecognizer@property (assign, nonatomic) NSUInteger tickleCount; //挠痒次数@property (assign, nonatomic) CGPoint currentTickleStart; //当前挠痒开始坐标位置@property (assign, nonatomic) Direction lastDirection; //最后一次挠痒方向@endKMGestureRecognizer.m

#import 'KMGestureRecognizer.h'#import UIKit/UIGestureRecognizerSubclass.h@implementation KMGestureRecognizer#define kMinTickleSpacing 20.0#define kMaxTickleCount 3- (void)reset { _tickleCount=0; _currentTickleStart=CGPointZero; _lastDirection=DirectionUnknown; if (self.state==UIGestureRecognizerStatePossible) { self.state=UIGestureRecognizerStateFailed; }}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch=[touches anyObject]; _currentTickleStart=[touch locationInView:self.view]; //设置当前挠痒开始坐标位置}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //『当前挠痒开始坐标位置』和『移动后坐标位置』进行X 轴值比较,

#import UIKit/UIKit.h#import 'KMGestureRecognizer.h'@interface ViewController : UIViewController@property (strong, nonatomic) UIImageView *imgV;@property (strong, nonatomic) UIImageView *imgV2;@property (strong, nonatomic) KMGestureRecognizer *customGestureRecognizer;@endViewController.m

本文[高级伪原创标题]到此分享完毕,希望对大家有所帮助。

  免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!

 
分享:
最新文章