iOS的手势识别器

1204--iOS之阅读Event Handling Guide for iOS 翻译(上),手势识别器 原文链接:https://www.jianshu.com/p/3778a218191b 都是别人翻译的,很牛 关于iOS的事件 用户操作iOS设备的方式有很多种,比如触摸屏幕、摇晃设备。当用户操作硬件时,iOS系统就会将这些事件进行捕获,然后翻译成事件信息传递给手机的应用程序进行处理,这样你的程序就可以对用户的人为动作进行识别并响应,当然,你的程序所支持的动作和响应越丰富... 阅读详情

一. 监听触摸事件的做法

  1. 如果想监听一个view上面的触摸事件,不使用手势实现的步骤
    (1). 自定义一个view
    (2). 实现view的touches方法,在方法内部实现具体处理代码

  2. 通过touches方法监听view触摸事件,有很明显的几个缺点
    (1). 必须得自定义view
    (2). 由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件
    (3). 不容易区分用户的具体手势行为

  3. iOS 3.2之后,苹果推出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度

二. 手势识别器简介

  1. 为了完成手势识别,必须借助于手势识别器:UIGestureRecognizer

  2. 利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势

  3. UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势

  4. UIGestureRecognizer的子类

    UITapGestureRecognizer(敲击)
    UIPinchGestureRecognizer(捏合,用于缩放)
    UIPanGestureRecognizer(拖拽)
    UISwipeGestureRecognizer(轻扫)
    UIRotationGestureRecognizer(旋转)
    UILongPressGestureRecognizer(长按)

三. UIGestureRecognizer的常见属性和方法

UIGestureRecognizer继承于NSObject

// 初始化手势要触发的对象与事件
- (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action
// 添加手势要触发的对象与事件
- (void)addTarget:(id)target action:(SEL)action;
// 移除手势要触发的对象与事件
- (void)removeTarget:(nullable id)target action:(nullable SEL)action;

// 手势状态
@property(nonatomic,readonly) UIGestureRecognizerState state;
// 代理
@property(nullable,nonatomic,weak) id <UIGestureRecognizerDelegate> delegate;
// 手势是否可用,默认YES 
@property(nonatomic, getter=isEnabled) BOOL enabled;
// 只读,手势所属的视图
@property(nullable, nonatomic,readonly) UIView *view;
// 默认YES.意思就是说一旦手势被识别,那么就调用[touchView touchesCancelled:withEvent]
@property(nonatomic) BOOL cancelsTouchesInView;
// 默认NO.意思就是再手势识别成功之前,touchObj还是要分发到touchView.
// 设置为YES的时候就表示从手势识别成功之前touchObj不给touchView分发
@property(nonatomic) BOOL delaysTouchesBegan;
// 默认YES:在手势识别成功之前,touchesEnded不会被调用。
// 设置为NO:在手势识别成功之前,touchesEnded会被调用
@property(nonatomic) BOOL delaysTouchesEnded;

// 当指定的识别器(调用者)识别失败,才去识别另一个识别器otherGestureRecognizer
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
// 获取手势识别器的触摸点
- (CGPoint)locationInView:(nullable UIView*)view;
// 获取手势识别器的触摸点个数
- (NSUInteger)numberOfTouches;
// 指定触摸点的位置
- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(nullable UIView*)view;

四. UIGestureRecognizer代理

注意: 使用多个手势必须使用代理

// 是否允许触发手势
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
// 是否允许多个同时支持多个手势,默认不允许,手势必须要设置代理
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

// 这个方法在这两个gesture recognizers中的任意一个将堵塞另一个的触摸事件时调用,
// 如果返回YES,则两个gesture recognizers可同时识别,
// 如果返回NO,则并不保证两个gesture recognizers必不能同时识别,
// 因为另外一个gesture recognizer的此方法可能返回YES。
// 也就是说两个gesture recognizers的delegate方法只要任意一个返回YES,则这两个就可以同时识别;
// 只有两个都返回NO的时候,才是互斥的。默认情况下是返回NO
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

// 是否允许手势识别器识别失败的时候使用另一个识别器otherGestureRecognizer
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
// 是否允许接收触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
// 是否允许接收长按点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press;

五. UIGestureRecognizer的子类常见属性和方法

1. UITapGestureRecognizer(敲击)

// 需要连续敲击几次才可触发,默认1次
@property (nonatomic) NSUInteger numberOfTapsRequired; 
// 需要几根手指一起敲击才可触发,默认1根
@property (nonatomic) NSUInteger  numberOfTouchesRequired __TVOS_PROHIBITED;

2. UIPinchGestureRecognizer(捏合,用于缩放)

提示: 模拟器快捷键:opsin + shift 向上拖“两个触摸点”

// 缩放比例
@property (nonatomic) CGFloat scale;
// 缩放速度
@property (nonatomic,readonly) CGFloat velocity;

3. UIPanGestureRecognizer(拖拽)

// 拖动的最短距离
@property (nonatomic) NSUInteger minimumNumberOfTouches __TVOS_PROHIBITED;
// 拖动的最长距离
@property (nonatomic) NSUInteger maximumNumberOfTouches __TVOS_PROHIBITED;
// 在指定的view上得坐标
- (CGPoint)translationInView:(nullable UIView *)view; 
// 设置在view中移动以后的坐标为translation
- (void)setTranslation:(CGPoint)translation inView:(nullable UIView *)view;
// 拖动view,返回的值就用于计算view相对于父控件拖动的速度
- (CGPoint)velocityInView:(nullable UIView *)view;

4. UISwipeGestureRecognizer(轻扫)

// 需要几根手指一起轻扫才可触发,默认1根
@property(nonatomic) NSUInteger numberOfTouchesRequired __TVOS_PROHIBITED;
// 设置轻扫方向
@property(nonatomic) UISwipeGestureRecognizerDirection direction;

5. UIRotationGestureRecognizer(旋转)

// 旋转角度
@property (nonatomic) CGFloat rotation;
// 旋转速度
@property (nonatomic,readonly) CGFloat velocity;

6. UILongPressGestureRecognizer(长按)

注意: 长安手势一般会触发两次,所有一般为了只做一次,要做一次判断

// 需要连续长按几次才可触发,默认0次
@property (nonatomic) NSUInteger numberOfTapsRequired;
// 需要几根手指一起长按才可触发,默认1根
@property (nonatomic) NSUInteger numberOfTouchesRequired __TVOS_PROHIBITED;
// 最小长按时间
@property (nonatomic) CFTimeInterval minimumPressDuration;
// 允许移动距离
@property (nonatomic) CGFloat allowableMovement;

六. 手势的具体使用

#import "ViewController.h"

@interface ViewController () <UIGestureRecognizerDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self setUpTap];

    [self setUpLongPress];

    [self setUpSwipe];

    [self setUpRotation];

    [self setUpPinch];

    [self setUpPan];

}


#pragma mark - 点按手势

- (void)setUpTap {

    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(actionUpTap)];

    // 多个手势必须要代理
    gestureRecognizer.delegate = self;

    [_imageView addGestureRecognizer:gestureRecognizer];
}

- (void)actionUpTap {

    NSLog(@"点按手势");

}


#pragma mark - 长按手势

- (void)setUpLongPress {

    UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(actionLongPress)];

    gestureRecognizer.delegate = self;

    [_imageView addGestureRecognizer:gestureRecognizer];
}

- (void)actionLongPress {

    NSLog(@"长按手势");
}


#pragma mark - 轻扫手势

- (void)setUpSwipe{

    // 默认向右轻扫,如果要同时有多个轻扫方向,必须要创建轻扫对象
    UISwipeGestureRecognizer *gestureRecognizerRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(actionSwipe)];

    [_imageView addGestureRecognizer:gestureRecognizerRight];

    UISwipeGestureRecognizer *gestureRecognizerLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(actionSwipe)];
    // 向左轻扫
    gestureRecognizerLeft.direction = UISwipeGestureRecognizerDirectionLeft;

    [_imageView addGestureRecognizer:gestureRecognizerLeft];

    UISwipeGestureRecognizer *gestureRecognizerUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(actionSwipe)];
    // 向上轻扫
    gestureRecognizerUp.direction = UISwipeGestureRecognizerDirectionUp;
    [_imageView addGestureRecognizer:gestureRecognizerUp];


    UISwipeGestureRecognizer *gestureRecognizerDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(actionSwipe)];
    // 向下轻扫
    gestureRecognizerDown.direction = UISwipeGestureRecognizerDirectionDown;
    [_imageView addGestureRecognizer:gestureRecognizerDown];

}

- (void)actionSwipe {

    NSLog(@"轻扫手势");
}


#pragma mark - 旋转手势

- (void)setUpRotation {

    UIRotationGestureRecognizer *gestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(actionRotation:)];

    gestureRecognizer.delegate = self;

    [_imageView addGestureRecognizer:gestureRecognizer];
}

- (void)actionRotation:(UIRotationGestureRecognizer *)rotation {

    _imageView.transform = CGAffineTransformRotate(_imageView.transform, rotation.rotation);

    // 复位
    rotation.rotation = 0;
}


#pragma mark - 捏合手势

- (void) setUpPinch {

    UIPinchGestureRecognizer *gestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(actionPinch:)];

    gestureRecognizer.delegate = self;

    [_imageView addGestureRecognizer:gestureRecognizer];
}

- (void)actionPinch:(UIPinchGestureRecognizer *)pinch {

    _imageView.transform = CGAffineTransformScale(_imageView.transform, pinch.scale, pinch.scale);

    // 复位
    pinch.scale = 1;
}


#pragma mark - 拖拽手势

- (void)setUpPan {

    UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(actionPan:)];

    gestureRecognizer.delegate = self;

    [_imageView addGestureRecognizer:gestureRecognizer];
}

- (void)actionPan:(UIPanGestureRecognizer *)pan {

    //NSLog(@"%ld",[pan numberOfTouches]);


    // 获取手势的触摸点
    // CGPoint curP = [pan locationInView:self.imageView];

    CGPoint panTrans = [pan translationInView:_imageView];

    _imageView.transform = CGAffineTransformTranslate(_imageView.transform, panTrans.x, panTrans.y);

    // 复位
    [pan setTranslation:CGPointZero inView:_imageView];
}


#pragma mark - 手势代理

// 是否允许多个同时支持多个手势,默认不允许,手势必须要设置代理
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

// 是否允许触发手势事件
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return YES;
}

// 是否允许接收触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return YES;
}

@end
iOS手势识别器(UIGestureRecognizer)编程详解 除了轻点手势识别器外,iOS还提供了其他常见的手势识别器,如拖动手势识别器(UIPanGestureRecognizer)、捏合手势识别器(UIPinchGestureRecognizer)、旋转手势识别器(UIRotationGestureRecognizer)等。在上述示例中,我们演示了如何添加手势识别器、实现手势事件处理方法,并介绍了常见的手势识别器和多手势识别的用法。在上述示例中,我们同时添加了拖动手势识别器和旋转手势识别器,并分别设置了它们的目标和动作。首先,我们需要在视图上添加手势识别器。 阅读详情

相关推荐

19、iOS 手势识别器的使用与实践

本文详细介绍了 iOS 开发中手势识别器的使用与实践,涵盖了内置手势识别器的类型、使用原则、基本步骤及状态管理。通过具体代码示例,展示了如何实现点击、拖动等常见手势操作,并探讨了多手势识别的协同处理机制,帮助开发者提升应用的交互体验。

motor的博客 123

iOS 手势识别

1.拖拽(Pan) 1.1声明一个手势识别 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];1.2在view上添加pan手势识别 [self.purpleView addGestureRecognizer:pan];1.3

omgd的学习笔记 1043

27、iOS 触摸处理与手势识别器全解析

本文深入解析了iOS开发中的触摸处理机制与手势识别器的使用,涵盖了不可见可触摸视图、手动解读触摸事件、内置手势识别器及其状态管理等核心内容。通过代码示例,展示了如何实现拖动、点击、缩放等常见交互效果,并探讨了手势识别器的高级应用、性能优化和调试技巧,帮助开发者提升应用的交互体验和开发效率。

grpc6streamer的博客 101

iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

1、UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性。 iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类。手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发这可以直接使用这些手势识别。 UITapGestureRecog...

空杯子 13万+

28、iOS开发中的手势识别器与触摸事件处理

本文深入讲解了iOS开发中手势识别器与触摸事件处理的机制和应用技巧。内容涵盖视图的移动与旋转效果实现、手势识别器的冲突与解决方法、委托的使用、手势识别器的子类化技术、在故事板中配置手势识别器,以及触摸事件的传递流程。通过实例代码和详细解析,帮助开发者掌握如何构建具有丰富交互性的iOS应用程序。

grpc6streamer的博客 61

iOS手势识别完全实战教程

本文还有配套的精品资源,点击获取 简介:手势识别在iOS应用开发中扮演关键角色,是用户交互的基础。"iOS GestureDemo"示例项目旨在帮助开发者理解和应用各种手势识别器。该项目包含"GestureDemo.xcodeproj"工程,演示了如何在应用中集成和自定义包括轻触、滑动、拖拽、捏合、旋转和长按在内的手势识别器。项目中还可能展示了手势识别器的创建、关联、优先级...

weixin_29323977的博客 1096

UI控件(3)

文章目录1、 UIPageViewController1.1 介绍1.2 语法2、UIActivityIndicatorView2.1 介绍2.2 语法3、UIGestureRecognizer3.1 介绍3.2 语法Tap1、介绍2、常用方法Pan1、介绍2、常用方法3、注意点LongPress1、介绍2、常用方法Swipe1、介绍2、常用方法 1、 UIPageViewController 1.1 介绍 UIPageViewController是iOS 5.0之后提供的一个分页控件可以实现图片轮播

nupt_zhai的博客 450

iOS开发:实现Tap手势识别器

手势识别器是iOS开发中的一类特殊的视图对象,它们属于类。这个类是所有手势识别器类的基类,包括等。通过这些内置的手势识别器,开发者可以快速地为应用添加对触摸事件的响应。UITapGestureRecognizer是iOS开发中广泛使用的手势识别器,用于识别用户在屏幕上进行的单击或双击操作。这个手势识别器尤其适用于需要通过点击操作来触发事件的UI元素,比如按钮、图片、文本等。UITapGestureRecognizer可以识别的点击数量是可配置的,能够适用于单击和双击的场景。

weixin_33205138的博客 979

UIGestureRecognizer iOS手势识别器

iOS手势识别器(UIGestureRecognizer) iOS手势识别器包括: 点击手势(UITapGestureRecognizer)  滑动手势 (UISwipeGestureRecognizer)  旋转手势 (UIRotationGestureRecognizer)  捏合手势 (UIPinchGestureRecognizer)  长按手势 (UILongPressGest

Scott_iOS的专栏 436

深入理解iOS手势识别器的应用与实践

本文将探讨iOS开发中手势识别器的使用,通过具体的代码示例和详细的步骤说明,介绍如何在应用中实现包括滑动、旋转在内的多种手势识别功能。文章首先介绍了手势识别器的分类和基本原理,然后通过实例展示如何检测特定的手势,并在应用中作出响应。

weixin_31659095的博客 497

iOS地图与手势识别器的实战应用

本文将探讨如何在iOS应用中集成地图和手势识别器功能。我们将深入分析从获取用户当前位置、设置导航指令到自定义地图视角,以及如何通过手势识别器来增强用户体验。

weixin_42186015的博客 476

iOS事件响应者链之被忽视的手势识别器工作原理

事件响应链

zhoupengju的博客 2657

掌握iOS手势识别器:平移、长按与轻击

本篇博客深入探讨了iOS中手势识别器的使用方法,重点解析了如何通过`UIPanGestureRecognizer`、`UILongPressGestureRecognizer`和`UITapGestureRecognizer`类实现平移、长按和轻击手势。文中提供了具体的代码示例和详细讨论,帮助读者更好地理解和应用这些手势识别技术。

weixin_42186015的博客 430

iOS 手势识别器概述

手势识别器 iOS 手势识别器(UIGestureRecognizer) 点击手势(UITapGestureRecognizer) 滑动手势(UISwipeGestureRecognizer) 旋转手势(UIRotationGestureRecognizer) 捏合手势( UIPinchGestureRecognizer) 长按手势( UILongPressGestu...

weixin_34375251的博客 154

手势识别器之敲击

这是我在学习ios的过程中写的一个demo,介绍了手势识别器中敲击动作。

Zabbix7.0+DeepSeek大模型实现人工智能告警分析

本方案基于Zabbix7.0监控系统,通过底层webhook脚本机制集成Deepseek做故障分析提供解决方案,构建智能化运维体系。

xingdiango的博客 2372

iOS 之手势识别器 UIGestureRecognizer

苹果为我们封装了7种手势识别 UIGestureRecognizer UITapGestureRecognizer UIPinchGestureRecognizer UIRotationGestureRecognizer UISwipeGestureRecognizer UIPanGestureRecognizer UIScreenEdgePanGestureRecognizer

242

MATLAB演示元胞自动机算法

一、元胞自动机理论 元胞自动机与格子理论是一个非常好的模型,许多复杂的问题都可以通过它来建立模型,下面就简要介绍一下。 元胞自动机 实质上是定义在一个具有离散、有限状态的元胞组成的元胞空间上,并按照一定的局部规则,在离散的时间维度上演化的动力学系统。 元胞 元胞又可称为单元、细胞,是元胞自动机的最基本的组成部分。 元胞具有以下特点: 元胞自动机最基本的单元。 元胞有记忆贮存状态的功...

frange zone 2万+

iOS常用手势识别器

手势识别状态: typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {     // 没有触摸事件发生,所有手势识别的默认状态     UIGestureRecognizerStatePossible,     // 一个手势已经开始但尚未改变或者完成时     UIGestureRecognizerStateBegan,

黑森林工作室 495

银河麒麟V10离线环境下的Python项目迁移:从Windows依赖到ARM架构适配

本文详细介绍了在银河麒麟V10离线环境下将Python项目从Windows迁移到ARM架构的完整流程。重点讲解了离线安装pip、virtualenv等基础工具的方法,以及如何解决ARM架构兼容性问题,确保项目依赖正确迁移。文章还提供了常见问题解决方案和性能优化建议,帮助开发者顺利完成国产化平台适配工作。

weixin_42639246的博客 422

拼团系统设计-人群标签的设计与思考

最近在学习一个拼团项目中涉及到的人群模块的设计,写下一些实现与思考。

wywcool的博客 971

iOS 手势识别器

iOS的输入事件 触摸事件 手势识别 一、iOS的输入事件   触摸事件(滑动、点击) 一、iOS事件对象都是UIEvent类的实例 UIEvent类对事件类型定义了enum常量: typedef NS_ENUM(NSInteger, UIEventType){      UIEventTypeTouches,      UIEventT

Sugarjunfeng的博客 582

【RTD】AD7793驱动程序

AD7793完整驱动程序,支持两线、三线、四线RTD。

只要思想不滑坡,想法总比问题多。 6172
上一篇: iOS中的触摸事件
下一篇: 核心绘图——Core Graphics
活在生活里
博客等级 码龄11年 94粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值