IOS之触摸与手势

54、iOS触摸与手势识别开发指南 本博客详细介绍了iOS开发中的触摸事件处理和手势识别机制,包括四种触摸通知方法的使用、手动实现滑动检测、使用UIGestureRecognizer进行自动手势识别以及多手指滑动的实现。通过示例项目TouchExplorer和Swipes,演示了如何检测点击、滑动等常见手势,并探讨了自定义手势识别器的实现方法。内容适合有一定iOS开发基础、希望提升手势交互功能开发能力的开发者。 阅读详情

一、触摸事件的处理方式
1.在IOS上,事件有多种形式:触摸事件,运动事件,远程控制事件。
2.触摸事件的处理方法
响应者类通过复写以下方法,可以监听触摸事件
(1)当一个或者多个手指触摸屏幕时:
- (void)touchesBegan:(NSSet *)touches withEvent:
(2)当一个或多个手指在屏幕上移动时:
- (void)touchesMoved:(NSSet *)touches withEvent:
(3)当一个或者多个手指离开屏幕时:
- (void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event;
(4)当触摸序列被系统事件(诸如电话呼入)所取消时:
- (void)touchesCancelled:(NSSet *)touches withEvent:


- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        //1.是否响应交互事件,默认为yes,UIImageView默认no
        //self.userInteractionEnabled = NO;

        //2.多点触摸,默认是no
        self.multipleTouchEnabled= YES;

    }
    return self;
}

----------

//1.触摸开始(当用户触摸屏幕时调用视图如下方法)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //UITouch --- 手指头的个数,一个touch表示一根手指(触摸点)
    //NSSet集合,保存UITouch对象,有几个触摸点,set里面就有几个触摸对象

    //点击的次数
    UITouch *touch = [touches anyObject];
    NSLog(@"tap count :%ld",touch.tapCount);

    //触摸的阶段,触摸事件在屏幕上有一个周期,即触摸开始、移动、结束和中途取消。而通过phase可以查看当前触摸事件在一个周期中所处的状态。
    NSLog(@"phase :%ld",touch.phase);

    //在视图上的位置坐标,这里返回的位置是针对VIEW的坐标系
    CGPoint point = [touch locationInView:self];
    NSLog(@"location in View:%@",NSStringFromCGPoint(point));

    //在window上的位置
    CGPoint windowPoint = [touch locationInView:[UIApplication sharedApplication].keyWindow];
    NSLog(@"location in window :%@",NSStringFromCGPoint(windowPoint));

    //在视图上前一个点的坐标
    CGPoint prepoint = [touch previousLocationInView:self];
    NSLog(@"previouslocation in preview :%@",NSStringFromCGPoint(prepoint));


}

----------

//2.触摸移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    //在视图上的位置坐标
    CGPoint point = [touch locationInView:self];
    NSLog(@"location in View:%@",NSStringFromCGPoint(point));

    //在视图上前一个点的坐标
    CGPoint prepoint = [touch previousLocationInView:self];
    NSLog(@"previouslocation in preview :%@",NSStringFromCGPoint(prepoint));

    //触摸的阶段
    NSLog(@"phase :%ld",touch.phase);

}

----------

//3.触摸结束
//- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    UITouch *touch = [touches anyObject];
//    //触摸的阶段
//    NSLog(@"phase :%ld",touch.phase);
//}
//触摸取消,一般用不到
//- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

@end

eg:下面介绍一个处理轻击事件的Demo:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(20, 20, 100, 100);
    [button setTitle:@"ClickAction" forState:UIControlStateNormal];
    [button addTarget:self
               action:@selector(buttonAction:)
     forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

}
----------
- (void)buttonAction:(UIButton *)btn
{
    NSLog(@"action");
}
----------
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if (touch.tapCount == 1)//单机
    {
        [self performSelector:@selector(singleTap)
                   withObject:nil
                   afterDelay:.2];
    }else if (touch.tapCount == 2)//双击
    {

        //*先取消单机,这一点很重要*
        [NSObject cancelPreviousPerformRequestsWithTarget:self
                                                 selector:@selector(singleTap)
                                                   object:nil];
        [self doubleTap];
    }       
}


----------

- (void)singleTap
{
    NSLog(@"单击");
}

- (void)doubleTap
{
     NSLog(@"双击");
}

2.运动事件

  • (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
  • (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
  • (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
    3.远程控制:(比如耳机线按钮控制音乐播放)
  • (void)remoteControlReceivedWithEvent:(UIEvent *)event;

二、事件传递的过程
这里写图片描述
这里写图片描述

三、响应者链
响应者对象是一个能接受并处理事件的对象。UIResponser是所有响应者对象的基类。
响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一响应者(next responder)。
下面是一个next responder的view的类目

#import "UIView+ViewController.h"

@implementation UIView (ViewController)

- (UIViewController *)viewController
{
    id next = [self nextResponder];
    while (next != nil) {

        if ([next isKindOfClass:[UIViewController class]]) {
            UIViewController *viewCtrl = next;
            return viewCtrl;
        }

        next = [next nextResponder];
    }
    return nil;
}

@end

四、手势识别器
UIGestureRecognizer类是用于检测和识别用户使用设备时所用的手势。它是一个抽象类,定义了所有手势的基本行为。以下是UIGestureRecognizer子类,用于处理具体的用户手势行为:

UITapGestureRecognizer(轻击)
UIPinchGestureRecognizer(捏合)
UIPanGestureRecognizer(平移)
UISwipeGestureRecognizer(清扫)
UILongPressGestureRecognizer(长按)
UIRotationGestureRecognizer(旋转)

其中注意的是区别两种手势(一只手单击、双击)

这里写图片描述
eg:

  //一只手单击
    UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapOnce)];
    tap1.numberOfTapsRequired = 1;
    tap1.numberOfTouchesRequired = 1;
    [self.view addGestureRecognizer:tap1];

 //一只手双击
    UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapTwice)];
    tap2.numberOfTapsRequired = 2;
    tap2.numberOfTouchesRequired = 1;
    [self.view addGestureRecognizer:tap2];
    [tap1 requireGestureRecognizerToFail:tap2];
----------
   //两只手单击
    UITapGestureRecognizer *tap3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapOnce)];
    tap3.numberOfTouchesRequired = 2;
    [self.view addGestureRecognizer:tap3];

    //两只手双击
    UITapGestureRecognizer *tap4 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapTwice)];
    tap4.numberOfTapsRequired = 2;
    tap4.numberOfTouchesRequired = 2;
    [self.view addGestureRecognizer:tap4];

    //区别两种手势
    [tap3 requireGestureRecognizerToFail:tap4];
----------
     //一只手向右轻扫
    UISwipeGestureRecognizer *swip2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swip2Action)];
    swip2.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swip2];   
----------  
    //捏合手势
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];

    [self.view addGestureRecognizer:pinch];
----------
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
    [self.view addGestureRecognizer:longPress];
----------
//长按手势
- (void)longPressAction:(UILongPressGestureRecognizer *)sender
{
     NSLog(@"长按");
    if (sender.state == UIGestureRecognizerStateBegan)
    {
        NSLog(@"开始");
    }else if (sender.state == UIGestureRecognizerStateChanged)
    {
        NSLog(@"移动");
    }else if (sender.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"结束");
    }
}

57、iOS 触摸与手势开发全解析 本文深入讲解了iOS开发中触摸事件和手势识别的处理方法,涵盖touchesBegan、touchesMoved等四个触摸通知方法,通过TouchExplorer应用展示了如何跟踪触摸信息,同时通过Swipes应用对比了手动检测滑动手势与使用UIGestureRecognizer自动识别手势的实现方式及优劣。适合iOS初学者及希望提升交互处理能力的开发者参考学习。 阅读详情

相关推荐

54、iOS 应用中触摸与手势识别开发指南

本文详细介绍了在iOS应用中实现触摸与手势识别的开发指南,涵盖tap、touch、滑动、多击等常见手势的检测与处理方法。通过使用UIGestureRecognizer及其子类,开发者可以轻松实现丰富的用户交互体验。内容包括触摸事件的基础处理、手势识别器的配置与优化,以及实际应用案例的解析,适用于希望提升应用交互性的iOS开发者。

brown的博客 145

iOS 手势识别(点按、长按、轻扫)

通过touches方法监听view触摸事件有以下几个缺点 1.必须得自定义view,在自定义的View当中去实现touches方法. 2.由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件 3.不容易区分用户的具体手势行为(不容易区分是长按手势,还是缩放手势)这些等. iOS 3.2之后,苹果推出了手势识别功能

LayneCheung 2594

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

本博客全面解析了iOS开发中的手势识别与触摸处理机制,涵盖手势识别器基础、子类化、委托方法、结合使用场景、3D Touch按压手势、触摸传递流程、命中测试原理以及优化技巧等内容。通过代码示例和流程图,帮助开发者深入理解并实现复杂的手势交互场景,如多手势组合、自定义手势识别器以及触摸性能优化,从而提升应用的交互体验和性能表现。

fox11的博客 87

iOS触摸优先级&&多手势处理

一张图说明iOS触摸优先级 手势识别器 -> 响应链的 onTouchBegin、onTouchMoved… 若手势识别器已经处理了,那么不会传递到响应链,相应的onTouchBegin、onTouchMoved…也不会被调用 多个手势的处理 通过设置gestureRecognizer的delegate,delegate实现: - (BOOL)gestureRecognizer:(...

mingC0758的博客 3989

42、iOS触摸与手势开发全解析

本文深入讲解了iOS开发中触摸与手势处理的核心技术,涵盖触摸探索、滑动检测和多点击检测三个完整应用示例,并详细展示了如何使用系统提供的手势识别器及自定义触摸逻辑。内容还包括对每个应用的拓展与优化思路,帮助开发者提升用户交互体验并掌握高级交互设计技巧。

s8t9u0v1w的博客 80

9、iOS 触摸事件处理与手势识别全解析

本文深入解析了iOS开发中的触摸事件处理与手势识别机制,涵盖了响应者链的工作原理、四个触摸通知方法的使用、手势识别器的应用以及自定义手势识别器的实现。通过示例项目TouchExplorer,帮助开发者更好地理解触摸事件的传递和处理方式,并提供了解决手势冲突的方法。适用于希望提升iOS应用交互体验的开发者参考。

devops8pract的博客 99

iOS多点触摸与手势

转自: http://book.51cto.com/art/201110/297453.htm 4.2.2 iOS多点触摸与手势 iOS赋予用户至少3.5英寸的宽广视野,在当时可谓令人眼前一亮。在这不大不小的舞台上,手指可以灵活地跳动,而在此之前,传统的触屏手机都只能用单指,而且很多都是电阻屏。但是自从iOS 横空出世之后,一切都改变了。 1)多点触摸 iOS彻底打破了传统

wangwei0327的专栏 1536

60、iOS开发:触摸手势与定位功能全解析

本文详细解析了iOS开发中的触摸手势与定位功能。内容涵盖触摸手势的检测、自定义手势的实现步骤,以及Core Location框架的基本使用和高级应用,如地理围栏和方向速度检测。同时,还介绍了手势优化、资源管理及用户体验方面的注意事项,帮助开发者打造更加实用和高效的iOS应用。

blue42的博客 139

iOS触摸事件与手势识别详解

一、iOS触摸事件 1.触摸事件的类型    触摸事件的类型一共有四个,一次完整的触摸,至少包括开始和结束两个事件    1>触摸开始,用手指(一根或者多根)按在屏幕上    2>触摸移动,手指在屏幕上发生移动(有可能会发生)    3>触摸结束,手指从屏幕上离开    4>触摸被取消,因为系统事件(例如电话呼叫)一次触摸事件被取消 2.触摸对象UITou

linfuran的博客 584

17、iOS 开发:触摸事件与手势识别全解析

本文深入解析了iOS开发中的触摸事件处理与手势识别机制,详细介绍了UIView的触摸事件回调方法,以及如何使用UIGestureRecognizer的不同子类(如UITapGestureRecognizer、UIPinchGestureRecognizer等)来实现丰富的用户交互。同时,还涵盖了手势冲突处理、触摸事件与手势协同工作的技巧,并通过多个代码示例展示了实际应用场景。适合希望提升iOS应用交互设计水平的开发者参考。

green的博客 134

58、iOS触摸事件与手势处理全解析

本文深入解析了iOS开发中的触摸事件与手势处理机制,涵盖响应链的工作原理、多点触控架构、四个触摸通知方法的使用,并通过两个实际应用(TouchExplorer和Swipes)展示了如何检测触摸事件和滑动手势。文章还分析了滑动手势的检测原理,介绍了开发中需要注意的问题、常见问题的解决方案以及应用的扩展与优化方向。通过本文,开发者可以全面掌握iOS触摸交互的核心知识,并应用于实际开发中,提升应用的交互体验。

blue42的博客 117

iOS基础 - 触摸事件与手势识别

一、iOS的输入事件 UIKit可识别三种类型的输入事件: 触摸事件 运动(加速计)事件 远程控制事件 二、UIEvent iOS中许多事件对象都是UIEvent类的实例,记录事件产生的时刻和类型 UIEvent类事件类型的enum常量: typedef NS_ENUM(NSInteger, UIEventType) { UIEventTypeTouches, UIEventT

1207

从零开始:用君正T23ZN打造智能门锁双摄系统(含代码示例与调试技巧)

本文详细介绍了基于君正T23ZN视频处理芯片构建智能门锁双摄系统的完整实战方案。内容涵盖硬件选型与核心电路设计、软件开发环境搭建、双摄驱动框架、图像信号处理(ISP)调优、人脸识别算法集成与性能优化,以及系统调试与稳定性保障。文章提供了丰富的代码示例和调试技巧,旨在帮助嵌入式开发者高效实现具备人脸识别与监控功能的低功耗智能门锁视觉系统。

opencv7vision的博客 716

ios自用学习笔记-触摸事件与手势识别

触摸事件与手势识别是ios中比较核心的功能,因为ios设备通常就只有5个实体按钮:音量大小,静音,开关与home键。因此了解、使用触摸事件与手势识别是学习ios的重点内容。 一、触摸事件 触摸事件主要有以下几个方法: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -(void)touchesMoved:(N

用博客见证自己的成长 956

触摸开关原理图_反激式开关电源PCB设计要点

由于最近工作中经常用到反激开关电源,就顺便做个有关反激电源PCB Layout方面的简单总结。关于变压器和补偿环路的设计原理和方法,可以参考之前的文章,链接如下:电子小白菜:反激电源变压器设计篇之详细设计步骤​zhuanlan.zhihu.com电子小白菜:反激电源变压器设计篇之基础原理​zhuanlan.zhihu.com电子小白菜:【干货分享】开关电源环路补偿设计步骤讲解​zhuanlan.z...

weixin_39574868的博客 1157

计组实验5:cache大小测量与 cache line 大小测量

前言 今天做了实验5,通过 c 语言测 cache 参数。其实按理来说挺简单的,只是我们班没给代码,纯靠自己。听说别的班有给代码 emm 因为《深入理解计算机系统》这本书上面给的代码是 Linux 平台下的,而且需要一个 fcyc2 头文件,可以在 https://github.com/fabiensanglard/CpuCacheMountainViewer 这里找到。 ⚠ 我没有在 Linux 下试过课本上面的代码。。。 我是在 win10 下测试的。。。 所以 。。。 我并不确定我的代码是否正确。

AKGWSB 's blog 1万+

IOS 触摸与手势

触摸 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIView????????????不接受触摸时间的三种...

165

ChatGPT Plus完整开通指南:从账号注册到稳定使用全流程

自然语言处理(NLP)技术通过深度学习模型实现对人类语言的理解与生成,其核心原理是基于Transformer架构的大规模预训练。GPT-4作为当前最先进的生成式AI模型,在代码编写、文档分析等场景展现出显著的技术价值。在实际应用中,稳定的网络环境和合规的支付方式是确保AI助手持续服务的关键因素。针对ChatGPT Plus的开通,需要系统性地解决账号验证、虚拟信用卡支付等工程实践问题,才能实现工作流的高效整合。

weixin_34239592的博客 426

iOS 第11章 触摸事件与手势

目标     了解多点触摸术语     理解响应者链     体系结构     多点触摸的基本应用   1、了解多点触摸术语 触摸事件    指手指放到 iOS 设备屏幕上 从屏幕上拖动或抬起。    iOS中触摸事件,基于多点触摸模型    多点触摸序列 NSSet*touches 一个或多个和屏幕接触的手指,识别为多点触摸序列的一部分 从第一个手指碰到屏幕开始,直到最后

杜甲同学的专栏 2649

VSCode + Clangd 配置避坑实录:从‘红波浪线’到完美代码提示的完整心路

本文详细记录了VSCode与Clangd配置过程中的常见问题及解决方案,从编译数据库生成到参数调优,帮助C++开发者快速解决代码提示失效、头文件找不到等问题,实现完美代码补全体验。重点介绍了Clangd与LLDB的集成配置及性能优化技巧,适用于Linux和跨平台开发环境。

weixin_28829479的博客 490

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

iOS —— 触摸事件传递及响应与手势

iOS 的事件分为三种,触摸事件(Touch Event)、加速器事件(Motion Events)、远程遥控事件(Remote Events)。这些事件对应的类为UIResponder。本文只探究触摸事件。 Tip:在模拟器中,按住option可以两根手指操作。同时按住option+shift可以移动两根手指。 触摸事件的处理 触摸事件可以分为两部分——传递和响应。 传递:系统把该事件传到最适...

weixin_33882443的博客 1062

全志DRM框架下LVDS双屏异显配置实战

本文详细介绍了在全志DRM框架下配置LVDS双屏异显的实战经验。涵盖硬件连接、内核配置、设备树修改、背光控制及U-Boot适配等关键步骤,重点解析屏参转换技巧与双屏route配置,帮助开发者解决工业控制台等多屏应用中的显示适配问题,提升开发效率。

rnn9storyteller的博客 813

IOS基础学习日志(四)手势与触摸

IOS基础学习日志(四)            今天我们主要学习了IOS手势与触摸相关的属性、定义、声明及操作,如下便是我们今天所学内容。 本章要点: 1、事件产生与分发 2、触摸 3、手势 4、手势识别器  触摸事件 Phone OS中的触摸事件基于多点触摸模型。 iPhone OS将一个或多个和屏幕接触的手指识别为多点触摸序列的一部分,该序列从第一个手指碰到屏幕开始,直到最

u012890071的专栏 1003

【AI应用实战-OpenCode】OpenCode安装部署(一)

OpenCode是一款2026年流行的开源AI编程工具,兼具轻量代码编辑器和智能编码代理功能。其核心优势包括:完全免费开源(MIT协议)、全平台兼容、支持75+大模型(含本地部署)、内置完整编程功能链(代码补全/Git集成/AI调试等),且所有数据本地存储确保隐私安全。相比Copilot等商业工具,OpenCode提供更自由的模型选择和零门槛使用体验。安装要求Windows10+/macOS12+/Linux主流发行版,仅需200MB空间和4G内存。该工具完美兼容VSCode生态,支持终端/桌面/IDE三种

2424

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

iOS开发————触摸与手势

在iOS设备中我们必不可少的操作便是在屏幕上触摸动作和相应的手势动作,那么你的触摸和手势是如何被iOS设备所识别并且做出相应响应的呢,接下来编者将浅谈其中的奥秘。 从事件发生到其处理的对象,传递要经过特殊的一段过程。当用户点击设备屏 幕时,iOS捕捉到一系列的触摸,将其打包到UIEvent对象中并放置到应用程序 活动事件队列中。UIApplication对象从事件队列中取出最前面的事件并将其

Lerryteng的博客 819

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: IOS之四种数据持久化方式
下一篇: 类目:nextResponder
Mainning
博客等级 码龄12年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值