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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • null toarray php,解决Laravel5.5下的toArray问题

    null toarray php,解决Laravel5.5下的toArray问题作为一个有轻度强迫症且受ThinkPHP影响较深的PHP码农,总觉得Laravel5.5的DB::xxoo->get()->toArray()之后竟然还没得到我想要的ThinkPHP中的select()出来的数组,于是决定做一下修改。PS:出于尽量不影响原有框架的考虑,我是新建了一个方法叫getList来暂代toArray那不知所谓的返回结果,在没有找到更好的解决办法之前,暂时这么用着…

    2022年5月14日
    2.3K
  • 程序员:多用吐槽的时间做点实际的事情

    昨天晚上很晚才睡觉,夜深的时候,静下心来,想想这一天,也想想这一年。也就在昨晚加入一个知识星球,“码农翻身”,是刘欣老师创建的。之前也买过刘欣老师的书籍,也一直在看关注码农翻身的公众号,从里面也学到了许多的东西。今天下班的地铁上,翻看了几篇星球的精华贴,其实有一个内容让我共鸣很大,因为目前我在的项目组里面的项目真的比较烂,不管从设计还是业务没有一个人能完全说的明白,并且项目和很多第三方的项目…

    2022年2月27日
    42
  • ipv6的ping_ping详解

    ipv6的ping_ping详解背景为什么需要使用IPv6,一个最直接的答案就是目前广泛应用的IPv4已经无法提供足够的IP地址来满足迅速增长的网络。IPv4采用32位地址长度,只有大约43亿个地址,很快就将被分配完毕。而IPv6采用128位的地址长度,几乎可以不受限制的提供地址。当然扩大地址空间只是IPv6的众多优势中的重要一项,除此之外,IPv6还能够提高网络的整体吞吐量、改善服务质量(QoS)、安全性有更好的保证、支持即插即用和移动性、更好实现多播功能等等。IPv6的地址获取方式与IPv4有所

    2025年6月20日
    3
  • 边缘检测算子Canny原理概述并利用OpenCV的库函数Canny()对图像进行边缘检测[通俗易懂]

    边缘检测算子Canny原理概述并利用OpenCV的库函数Canny()对图像进行边缘检测[通俗易懂]图像边缘检测的概念和大概原理可以参考我的另一篇博文,链接如下:https://blog.csdn.net/wenhao_ir/article/details/51743382本篇博文介绍边缘检测算子Canny,并利用OpenCV的库函数Canny()对图像进行边缘检测。Canny算子是JohnCanny在1986年发表的论文中首次提出的边缘检测算子,该算子检测性能比较好,应用广泛。Canny算法被推崇为当今最优的边缘检测的算法。Canny算子进行边缘检测的原理和步骤如下:⑴消除噪声。边缘

    2022年5月29日
    39
  • 常见电机分类和驱动原理动画[通俗易懂]

    常见电机分类和驱动原理动画[通俗易懂]常见电机分类和驱动原理动画文章目录常见电机分类和驱动原理动画基本分类直流有刷电机直流无刷电机(BLDC)步进电机(Steppermotor)舵机(steeringengine)伺服电机(servomotor)基本分类直流有刷电机电机的基本原理就是电磁感应:旋转磁场带动转子转动。电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。这便实现了电能->磁能->机械能的转换直流无刷电机(BLDC)BLDC的定子(stator)是通电的线圈,而

    2022年6月10日
    40
  • 回文字符串判断以及最长回文字符串长度判断「建议收藏」

    回文字符串判断以及最长回文字符串长度判断「建议收藏」回文字符串,就是正着反着读都一样的字符串。1、回文字符串判断假如这个字符串为奇数长度的回文字符串,则除了最中间的字符外,其左右的字符串两两相同。假如这个字符串为偶数长度的回文字符串,则其左右完全对称。代码如下:#include<iostream>#include<string>usingnamespacestd;boolpalindrome(strin…

    2022年6月5日
    28

发表回复

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

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