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


相关推荐

  • 神思SS628(100)型第二代身份证验证阅读机具二次开发

    神思SS628(100)型第二代身份证验证阅读机具二次开发神思SS628(100)型第二代身份证验证阅读机具是神思电子一款经典产品B/S项目中需要读取个人的身份信息进行登记,为了提高效率,选择了神思电子的神思SS628(100)型第二代身份证验证阅读机,具体使用步骤如下:首先下载驱动包,由于该功能也是基于ocx插件进行交互的,,所以要先安装驱动下面提供下载地址:根据自己的系统型号进行安装链接:https://pan.baidu.com/s/15…

    2022年6月27日
    42
  • Kettle工具入门[通俗易懂]

    Kettle工具入门[通俗易懂]Kettle工具入门Kettle工具入门 Kettle是什么? 为什么要用Kettle? 怎么用Kettle? 下载运行 简单应用 表到表转换 json到表的操作 参考 Kettle是什么?Kettle是水壶。“多喝热水”是我们对女朋友美好的祝福。因为未经处理的生水(原始数据),含有各种杂质(脏数据),无法直接饮用(入…

    2022年10月17日
    2
  • 出现namenode不能启动的情况,就把hadoop安装目录下的hadoop目录下的data和name文件夹清空,[通俗易懂]

    出现namenode不能启动的情况,就把hadoop安装目录下的hadoop目录下的data和name文件夹清空,[通俗易懂]出现namenode不能启动的情况,就把hadoop安装目录下的hadoop目录下的data和name文件夹清空,

    2022年4月23日
    52
  • 什么是递归函数?[通俗易懂]

    什么是递归函数?[通俗易懂]递归函数递归例题特点效率优点递归函数递归递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。所以递归要有两个要素,结束条件与递推关系注:递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当…

    2025年10月29日
    5
  • .net的ValidateRequest 属性

    .net的ValidateRequest 属性ValidateRequest属性转载 2009年10月17日12:44:00标签:html /asp.net /正则表达式 /设计模式 /公告 /c#1220               在ASP.NET1.1中,@Page指令上的ValidateRequest属性被打开后,将检查以确定用户没有在查询字符串、Cooki

    2022年5月29日
    27
  • 视频直播连麦技术详解「建议收藏」

    视频直播连麦技术详解「建议收藏」前言:随着带宽、Wifi的不断升级,手机的普及,直播技术不断突破,各种门槛在降低,全民直播时代已经来临。直播也深入到各行各业,比如说在线教育,还有财经行业等,也渐渐成为各行各业的标配。云帆加速自成立以来就一直致力于流媒体领域企业服务,尤其对于直播,目前已经推出了针对于不同场景的直播云解决方案,在保证广大用户使用体验的前提下,为客户节省更多的研发成本。无论是传统企业转型,或者是创业企业,云帆加速都…

    2022年7月24日
    34

发表回复

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

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