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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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方法中获取触摸对象当前位置,并通过于与原始位置的差值计算出移动偏移量,再设置当前视图的位置。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164178.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在线客服系统源码 自适应手机移动端 支持多商家 带搭建教程

    在线客服系统源码 自适应手机移动端 支持多商家 带搭建教程下载链接:在线客服系统源码自适应手机移动端支持多商家支持微信公众号/微信小程序带搭建教程-PHP文档类资源-CSDN下载PHP轻量级人工在线客服系统源码自适应手机移动端支持多商家带搭建教程支持多商家支持多商家,每个注册用户为一个商家,每个商家可以添加多个客服。不限坐席每个商家可以无限添加坐席,不限制坐席数支持H5移动端系统自动适配移动端,也可以接入app(h5方式)支持微信公众号/微信小程序客服可以与微信公众号/小程序里的访客实时沟通常见问题自动回复…

    2022年7月19日
    17
  • 电力通信网体系结构图_电力通信技术

    电力通信网体系结构图_电力通信技术电力通信网体系的分层可以从水平和垂直两个方面去理解:水平方向上可以划分两层,即骨干通信网、接入通信网;垂直方向上骨干网又可以分为传输网、数据网、支撑网。其中接入通信网可分为输变电通信网与配电通信网。一、骨干通信网1.1传输网:是由线路设施、传输设施等组成的为传送新消息业务提供所需传送承载能力的通道,它是通信网络的基础,它为整个通信网络上所承载的业务提供传输通道和平台。1.2

    2022年9月16日
    0
  • 二进制的权展开式_进制按权展开方法

    二进制的权展开式_进制按权展开方法1.问题描述为什么二进制按权展开就是十进制?按照我们所学到的知识,来举例说明。比如:(1111)2按权展开就是:1×23+1×22+1×21+1×20=15我们得到了15对吧,那么两个问题为什么15这个就是十进制呢?为什么展开后相加就正好等于十进制的15呢?2.问题解答首先来看我们为什么按权展开?(1111)2因为逢二进一所以按权展开就是要这样:1×23+1×22+1×21+1×20由于我们习惯性的把加起来的和等于十进制的15所以我们会误认为,按权展开就是十进制其.

    2022年10月17日
    0
  • 【愚公系列】2022年5月 ASP.NET Core下Worker Service构建系统服务实现任务调度

    【愚公系列】2022年5月 ASP.NET Core下Worker Service构建系统服务实现任务调度使用vs2019创建WorkerService程序首先nuget安装Microsoft.Extensions.Hosting.Windows在Program中添加UseWindowsService()publicclassProgram{publicstaticvoidMain(string[]args){CreateHostBuilder(args).Build().Run();}

    2022年7月11日
    18
  • 基于matlab的Canny算法的边缘检测(附源代码)

    基于matlab的Canny算法的边缘检测(附源代码)边缘概述边缘可以认为是图像中一定数量点亮度发生变化的地方,边缘检测大体上就是计算这个亮度变化的导数,依据导数的大小,判断亮度变化大小,从而界定目标与背景。在经典的边缘检测算法中Roberts算子,Prewitt算子,Sobel算子属于一阶差分算子,LoG算子,Canny算子属于二阶差分算子。一阶差分算子,就是求图像灰度变化曲线的导数,从而可以突出图像中的对象边缘,而二阶差分算子,求图像灰度变化导数的导数,对图像中灰度变化强烈的地方很敏感,从而可以突出图像的纹理结构。即一阶求边缘,二阶不仅检测出边缘还可检测

    2022年5月7日
    43
  • 黑客刷屏代码大全(怎么请黑客)

    黑客初学者刷屏技巧Whenyoujuststartoutyourprogrammingjourney,therearesomanyshinytoolsandtechnologiestoexplore,youalmostdon’tknowwheretostart.Fortunately,therearenumerousguidesonho…

    2022年4月13日
    145

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号