touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event使用

article/2025/9/22 2:32:03

iOSProgramming – 触摸事件处理(2)

         在上一篇《iOS Programming – 触摸事件处理(1)》中了解触摸、事件和响应者之后,接下去学习如何处理用户的触摸事件。首先触摸的对象是视图,而视图的类UIView继承了UIRespnder类,但是要对事件作出处理,还需要重写UIResponder类中定义的事件处理函数。根据不通的触摸状态,程序会调用相应的处理函数,这些函数包括以下几个:

            -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event;

            -(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent *)event;

            -(void)touchesEnded:(NSSet *)toucheswithEvent:(UIEvent *)event;

            -(void)touchesCancelled:(NSSet *)toucheswithEvent:(UIEvent *)event;

            当手指接触屏幕时,就会调用touchesBegan:withEvent方法;

            当手指在屏幕上移时,动就会调用touchesMoved:withEvent方法;

            当手指离开屏幕时,就会调用touchesEnded:withEvent方法;

            当触摸被取消(比如触摸过程中被来电打断),就会调用touchesCancelled:withEvent方法。而这几个方法被调用时,正好对应了UITouch类中phase属性的4个枚举值。

            上面的四个事件方法,在开发过程中并不要求全部实现,可以根据需要重写特定的方法。对于这4个方法,都有两个相同的参数:NSSet类型的touches和UIEvent类型的event。其中touches表示触摸产生的所有UITouch对象,而event表示特定的事件。因为UIEvent包含了整个触摸过程中所有的触摸对象,因此可以调用allTouches方法获取该事件内所有的触摸对象,也可以调用touchesForVIew:或者touchesForWindows:取出特定视图或者窗口上的触摸对象。在这几个事件中,都可以拿到触摸对象,然后根据其位置,状态,时间属性做逻辑处理。

            例如:

复制代码
- ( void )touchesEnded:(NSSet  * )touches withEvent:(UIEvent  * ) event
{
    UITouch 
* touch  =   [touches anyObject];
    
if (touch.tapCount  ==   2 )
    {
        self.view.backgroundColor 
=  [UIColor redColor];
    }
}
复制代码

            上面的例子说明在触摸手指离开后,根据tapCount点击的次数来设置当前视图的背景色。不管时一个手指还是多个手指,轻击操作都会使每个触摸对象的tapCount加1,由于上面的例子不需要知道具体触摸对象的位置或时间等,因此可以直接调用touches的anyObject方法来获取任意一个触摸对象然后判断其tapCount的值即可。

            检测tapCount可以放在touchesBegan也可以touchesEnded,不过一般后者跟准确,因为touchesEnded可以保证所有的手指都已经离开屏幕,这样就不会把轻击动作和按下拖动等动作混淆。

            轻击操作很容易引起歧义,比如当用户点了一次之后,并不知道用户是想单击还是只是双击的一部分,或者点了两次之后并不知道用户是想双击还是继续点击。为了解决这个问题,一般可以使用“延迟调用”函数。

            例如:

复制代码
- ( void )touchesEnded:(NSSet  * )touches withEvent:(UIEvent  * ) event
{
    UITouch 
* touch  =   [touches anyObject];
    
if (touch.tapCount  ==   1 )
    {
        [self performSelector:@selector(setBackground:) withObject:[UIColor blueColor] afterDelay:
2 ];
        self.view.backgroundColor 
=  [UIColor redColor];
    }
}
复制代码

            上面代码表示在第一次轻击之后,没有直接更改视图的背景属性,而是通过performSelector:withObject:afterDelay:方法设置2秒中后更改。

复制代码
- ( void )touchesEnded:(NSSet  * )touches withEvent:(UIEvent  * ) event
{
    UITouch 
* touch  =   [touches anyObject];
    
if (touch.tapCount  ==   2 )
    {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(setBackground:) 
object :[UIColor redColor]];
        self.view.backgroundColor 
=  [UIColor redColor];
    }
}
复制代码

        双击就是两次单击的组合,因此在第一次点击的时候,设置背景色的方法已经启动,在检测到双击的时候先要把先前对应的方法取消掉,可以通过调用NSObject类的cancelPreviousPerformRequestWithTarget:selector:object方法取消指定对象的方法调用,然后调用双击对应的方法设置背景色为红色。

            下面举个例子创建可以拖动的视图,这个主要通过触摸对象的位置坐标来实现。因此调用触摸对象的locationInView方法即可。

            例如:

复制代码
CGPoint originalLocation;
- ( void )touchesBegan:(NSSet  * )touches withEvent:(UIEvent  * ) event
{
    UITouch 
* touch  =  [touches anyObject];
    originalLocation 
=  [touch locationInView:self.view];
}

- ( void )touchesMoved:(NSSet  * )touches withEvent:(UIEvent  * ) event
{
    UITouch 
* touch  =  [touches anyObject];
    CGPoint currentLocation 
=  [touch locationInView:self.view];
    CGRect frame 
=  self.view.frame;
    frame.origin.x 
+=  currentLocation.x - originalLocation.x;
    frame.origin.y 
+=  currentLocation.y - originalLocation.y;  
    self.view.frame 
=  frame;
}
复制代码
            这里先在touchesBegan中通过 [touch locationInView : self . view ] 获取手指触摸在当前视图上的位置,用CGPoint变量记录,然后在手指移动事件touchesMoved方法中获取触摸对象当前位置,并通过于与原始位置的差值计算出移动偏移量,再设置当前视图的位置。

http://chatgpt.dhexx.cn/article/wmmIHGeF.shtml

相关文章

iOS事件机制,以及不同手势使用touchesBegan等表现

2019独角兽企业重金招聘Python工程师标准>>> //事件处理方法 UIResponder中定义了一系列对事件的处理方法,他们分别是: –(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event –(void)touchesMoved:(NSSet )touches withEvent:(U…

ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled()的关系) 先看效果图 本文中,凡是看到xxx(),即表示xxx是一个函数或者方法!!!事件分为事件传递和事…

【application Extension 之TodayExtension】扩展与宿主App之间共享数据有两种方式

文章目录 前言I 、点击跳转到APPII、扩展与宿主App之间共享数据有两种方式:2.1.通过NSUserDefaults2.2. 通过一个扩展与App都可以访问的共享容器,来存放文件,数据(Core Data, Sqlite等都可以存放在这个共享的容器中)III、扩展Widget高度前言

PHP-递归算法

在PHP开发过程中,递归算法通常用于无限极分类。那么所谓递归就是一种函数调用自身的机制。简单来说就是在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自…

php 递归 递归方式与算法

先设置数据在本地数据库,设置前要先了解pid字段的关系。如果做成菜单还需添加一个路由字段,自行定义。 第一种方式 先将数据提取出转换成数组。重点是Yarray方法里的递归方式。 接下来进行解析方式。 重点:一定要在进行递归之前声明一个静态…

关于递归函数

递归函数概念 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 所以递归要有两个要素,…

php递归函数详解

很多同学在学习递归函数的时候会感到头晕,无法搞清楚递归函数的原理和运行机制,本文将给大家详细讲解递归函数的运行机制和运用。 那什么是递归函数呢? 递归函数即为自调用函数,在函数体内直接或间接自己调用自己,但需…

递归函数

一、基本的递归函数 首先先来了解下C程序在内存中的组织方式,基本上来说一个可执行的程序在内存中有4个区域组成:代码段、静态数据区、堆与栈。代码段包含程序运行时所执行的机器指令;静态数据区是包含在程序的生命周期内的一直持续的数据&a…

PHP 递归函数的理解

很多同学在学习递归函数的时候会感到头晕,无法搞清楚递归函数的原理和运行机制,本文将给大家详细讲解递归函数的运行机制和运用。那什么是递归函数呢?递归函数即为自调用函数,在函数体内直接或间接自己调用自己,但需要…

PHP中使用递归函数

下面是使用递归函数的一个小例子。 目的是根据parent_id和task_id对task进行分类。 具体实现&#xff1a; <?php //连接数据库&#xff0c;使用前几天创建的数据库连接文件进行连接&#xff0c;如果没有这个文件可以去我的博客里找一下 require_once(./db.php); $conn…

PHP递归详解

递归 递归是一种函数调用自身的机制递归必须要有边界条件&#xff0c;也就是递归出口&#xff08;退出递归&#xff09;递归前进段和递归返回段&#xff0c;也就是最后得到的值当边界条件不满足时&#xff0c;递归前进&#xff1b;当边界条件&#xff08;递归出口&#xff09;…

PHP 递归函数

递归函数即自调用函数&#xff0c;在函数体内部直接或间接的自己调用自己&#xff0c;即函数的嵌套调用就是函数本身。通常 在此类型的函数体中会附加一个条件判断&#xff0c;以判断是否需要执行递归调用&#xff0c;并且在特定的条件下终止函数的递归 调用动作&#xff0c;…

软件设计师考试感想随笔

带着紧张期待的心情查询了2021年下半年的软件设计师考试成绩&#xff0c;上午55分&#xff0c;下午66分&#xff0c;对这个成绩也算预料之中&#xff0c;因为我刚考完不到一个星期就在网上搜了答案对了成绩。 刚开始的时候买的纸质教程&#xff0c;厚厚的一本&#xff0c;还没看…

软考中级,软件设计师考试那些内容,考试大纲什么的?

一、中级软件设计师科目包括&#xff1a; &#xff08;1&#xff09;计算机与软件工程知识&#xff0c;考试时间为150分钟&#xff0c;笔试&#xff0c;选择题&#xff1b; &#xff08;2&#xff09;软件设计&#xff0c;考试时间为150分钟&#xff0c;笔试&#xff0c;问答…

软考软件设计师中级考试大纲(附题型举例)

软件设计师考试大纲 一、考 试 说 明 1&#xff0e;考试目标 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求&#xff0c;按照系统总体设计规格说明书进行软件设计&#xff0c;编写程序设计规格说明书等相应的文档&#xff0c;组织和指导程序员编写、调试程序…

软考中级–软件设计师考试大纲

软考中级–软件设计师考试大纲 考试场数&#xff1a;上午&#xff08;基础理论&#xff0c;75个选择题&#xff0c;1空1分&#xff09;、下午&#xff08;案例分析&#xff0c;五个解答题&#xff0c;每道题15分&#xff09; 分数线&#xff1a; 上下午满分都是75分&#xff…

软件设计师提纲+复习资料整理(上午题)

文章目录 软件设计师考试大纲上午题&#xff08;选择题&#xff09;一、计算机组成原理考点&#xff1a;CPU结构组成考点&#xff1a;原码、反码、补码定点整数范围考点&#xff1a;浮点数表示考点&#xff1a;RISC和CISC计算机的区别考点&#xff1a;奇校验与偶校验考点&#…

【软考-软件设计师精华知识点笔记】考试大纲及题型介绍

前言 今年上半年参加了软件设计师考试&#xff0c;考完感觉稳了&#xff08;成绩下来已经通过了&#xff09;&#xff0c;考试内容与我学习的内容基本一致&#xff0c;因此感觉自己的笔记可以帮助其他准备考试的童鞋。总共十一章的笔记&#xff0c;已完成。如果未来有机会&…