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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm激活码2021年(已测有效)

    pycharm激活码2021年(已测有效),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • STM32中断优先级NVIC

    STM32中断优先级NVIC参考正点原子视频为什么STM32需要中断就拿你去饭馆吃饭为例。使用中断就是饭做好了,服务员会为你端上来,然后你开始吃饭。端上来之前你爱干啥就干啥。不使用中断,你需要一次一次去问服务员饭做好了没有,这期间你没办法去做其他事情。CM3(CortexM3)内核支持256个中断,其中包括16个内核中断和240个外部中断,并且具有256级的可编程中断设置STM32并没有使用CM3内核的全部东西,而是只用了它的一部分STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优

  • CORBA简介_吴帝聪简介

    CORBA简介_吴帝聪简介 1.CORBA:CommonObjectRequestBrokerArchitecture,通用对象请求代理体系。是由对象管理组(ObjectManagementGroup,OMG)制定的一种标准的面向对象分布式应用程序体系规范,旨在为异构分布式环境中,硬件和软件系统的互联而提出的一种解决方案。2.解决异构分布式系统两条主要原则:(1).寻求独立于平台的模型和抽象,这

  • pytorch lstm训练例子_半对数模型参数的解释

    pytorch lstm训练例子_半对数模型参数的解释LSTM的参数解释LSTM总共有7个参数:前面3个是必须输入的1:input_size:输入特征维数,即每一行输入元素的个数。输入是一维向量。如:[1,2,3,4,5,6,7,8,9],input_size就是92:hidden_size:隐藏层状态的维数,即隐藏层节点的个数,这个和单层感知器的结构是类似的。这个维数值是自定义的,根据具体业务需要决定,如下图:input_…

  • 如何分析heapdump文件_heapdump怎么看

    如何分析heapdump文件_heapdump怎么看jhat是Java堆分析工具(JavaheapAnalyzesTool).在JDK6u7之后成为标配.使用该命令需要有一定的Java开发经验,官方不对此工具提供技术支持和客户服务。用法:jhat[options]heap-dump-file参数:options可选命令行参数,请参考下面的Optionsheap-dump-file要查看的二进制Java堆转储文件(Java…

  • Car Fleet 车队

    Car Fleet 车队N  辆车沿着一条车道驶向位于 target 英里之外的共同目的地。每辆车 i 以恒定的速度 speed[i] (英里/小时),从初始位置 position[i] (英里)沿车道驶向目的地。一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车以相同的速度紧接着行驶。此时,我们会忽略这两辆车之间的距离,也就是说,它们被假定处于相同的位置。车队 是一些由行驶在相同位置、具有相同…

发表回复

您的电子邮箱地址不会被公开。

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