本文摘自:http://www.cocoachina.com/blog/article.php?type=blog&itemid=147
处理多点触控事件Handling Multi-Touch Events
处理多点触控事件,你自己的定制UIview子类别(或者,不频常,你自己的定制UIApplication或UIwindow子类别),要实行至少在其中的UIResponder方法事件处理。以下章节描述这些方法,讨论的方法处理常用手势,显示出典型的回应者物件处理一个复杂序列多点触控事件,并提出了一些技术事件处理。
在这一章节:
事件的处理方法
处理轻拍的手势
处理重拍的手势
在处理复杂的多点触控顺序
事件处理技巧
事件的处理方法
在一个多点触控序列,应用程式分派了一系列的事件讯息。接受和处理这些信息,回应者物件类别必须实作(implement)至少有下列情形之一的方法(methods)公告
Copy code
应用程式发送这些讯息,针对某个触摸(touches)阶段,当有新的或改变触摸:
.一个或更多的手指触摸下在萤幕上,它发送了touchesBegan : withEvent :讯息。
.一个或更多的手指移动,它发送了touchesMoved : withEvent :讯息。
.一个或更多的手指从萤幕上离开,它发送了touchesEnded : withEvent :讯息。
每一个这些方法的,是与触摸阶段(例如UITouchPhaseBegan) ,其中任何UItouch物件,你可以找到评估它阶段的属性。
每一个讯息,就是引用一个事件的处理方法,传送两个参数。第一,是一套UItouch物件所代表的新的或经改变触摸,涉及为特定阶段。第二个参数是一个UIEvent物件代表这个特别的事件。从事件物件,你可以得到所有接触物件为事件( allTouches )触摸物件的一个子集,过滤为View或Windows 。一些这些触摸物件代表触及这并没有改变,自上次事件信息的,或已改变,但在不同阶段进行。
回应者物件经常处理的事件,为某一特定阶段所获得一种或一种以上的UItouch物件在传送一套,然后再评估其属性或获得它们的位置。 (如果有任何触摸物件会做,可采取送NSSet物件的一个anyObject信息)的一个重要方法是locationInView :,其中,如果传送self的参数,产生的位置触摸在回应者物件坐标系统(previousLocationInView:) 。一个平行的方法告诉你,上次的位置触摸( previousLocationInView: ) 。 UITouch的属性案例(instance)告诉你有多轻拍(taps)已作出( tapCount ),当触摸己建立或最后己变化(timestamp)且是否触摸被强拍(swipe),如果这样,在哪个方向( info)。
回应者类别并不实作所有三个这事件的方法上面所列。举例来说,如果它正在寻找一手指时,他们从萤幕离开,它只需实作touchesEnded : withEvent : 。事实上,不是执行上述的任何方法,回应者颣别可实作touchesChangedwithEvent :和监测阶段,触及在那个方法。
如果一个回应者建立持久的物件,而在处理事件过程中多点触摸序列,它应实作touchesCanceled处置这些物件时,该系统取消了序列。取消经常发生时,一个外部事件,举例来说,一通电话打乱目前的应用程序的事件处理。注意到一回应者物件个也应处置这些同样的物体,当它接收最touchesEnded : withEvent :留言,为一个多点触摸序列。 (见"事件处理技术" Event-Handling Techniques),以了解如何确定最后的触摸在一个序列) 。
处理轻拍的手势
一件很平常的手势,在iPhone的应用程式中是轻拍(tap):使用者他或她的手指轻拍(taps)一个物件。回应者物件能回应一个单一的轻拍中的一个方法,一个双轻拍(double-tap)在另一个,并可能分三轻拍(tripe-tap),但另一种方式表达。以确定有多少次使用者轻拍回应者物件,你会得到tapCount属性值的一个UITouch物件。
最好的地方找到这个值(Value)所采用的方法touchesBegan : withEvent :和touchesEnded : withEvent :。在很多情况下,后者的方法是首选,因为它对的回应至于触摸阶段在使用者轻离开拍。由寻找该轻拍的计算(count)轻拍后往上(touch-up)阶段( UITouchPhaseEnded ) ,你确保手指,实在是打字中,比如,在案例,轻拍下(touching down)然后拖曳(dragging )。
在列表8-1 , touchesEnded : withEvent :方法实作回应双轻拍(double-tap)手势缩放的内容显示在一个scroll View。
列表8-1处理双双轻拍(double-tap)手势
Copy code
Copy code
该方法取得了一个触摸物件从通过在设置评估bit mark物件的info属性,以确定是否UITouchInfoSwipedRight和UITouchInfoSwipedLeft是常量。注意,当该系统探测到重拍的手势,在一个方向,如"向右上角的萤幕上" ,它规定了两个常数bit mark比,以显示这个方向(例如, UITouchInfoSwipedRight和UITouchInfoSwipedUp ) 。
在处理复杂的多点触控顺序
轻拍(taps)及重拍(swipes)是简单的手势。处理多点触控摸顺序是更为复杂-效果上,诠释一个特定应用手势取决于哪些应用程式正试图完成的任务。你可能要跟踪所有涉触模的阶段,录制触摸属性已改变,变更内部状态的。
最好的方法传达你如何可能处理复杂的多点触控摸顺序,用一个例子。列表8-3日,显示出如何定制UIView物件回应触及动态的"欢迎"的标语牌围绕在萤幕上当用手指的动作,当用户重拍的手势,并改变欢迎的语言的。
Copy code
Copy codeCopy codeCopy code}