2013-07-02 71 views
7

有人可以解释这两种方法之间的高级差异吗?特别是,你们什么时候使用一种,而且这些方法的目的有没有重叠? 他们似乎是为了相同的目的,但在文档中似乎没有任何关系,这让我感到困惑。beginTrackingWithTouch和touchesBegan有何区别?

回答

7

beginTrackingWithTouch:withEvent:方法

1)子类UIControl

2)发送至当与所述给定事件的触​​摸进入控制的边界的控制。

3)提供自定义的跟踪行为(例如,更改高亮显示)。 要做到这一点,使用一个或全部下列方法:beginTrackingWithTouch:withEvent:,continueTrackingWithTouch:withEvent:,endTrackingWithTouch:withEvent:方法


的touchesBegan:withEvent:方法

1)子类UIResponder

2)当一个或多个手指在视图或窗口中触碰时告诉接收器。

3)有两种常见类型的事件:触摸事件和动作事件。 触摸的主要事件处理方法是touchesBegan:withEvent :, touchesMoved:withEvent :, touchesEnded:withEvent :, touchesCancelled:withEvent :. 这些方法的参数将触摸与它们的事件相关联 - 特别是新的或已更改的触摸 - 并因此允许响应器对象跟踪和处理触摸,因为交付的事件通过多点触摸序列的阶段进行。每当手指触摸屏幕,在屏幕上拖动或从屏幕上抬起时,都会生成一个UIEvent对象。事件对象包含用于屏幕上所有手指的UITouch对象或仅从其上取下。

+0

好答案谢谢。 – petric

+2

谢谢。把它放到上下文中:我有一个包含一堆子视图(例如标签)的自定义控件。用户应该能够拖动这些标签,并且它们以主控制(容器)控制的方式与彼此(在运动期间)交互。我应该使用哪种触摸方法来实现拖动:由UIControl提供的那些,还是由UIResponder提供的? – rmp251

3

今天刚刚遇到这个问题,我认为最主要的区别是beginTrackingWithTouch和朋友只用于跟踪 - 而不是其他任何事情 - 特别是不用于目标/动作处理。所以如果你重写touchesBegan,那么当触摸结束时,你也要负责调用sendActionsForControlEvents。但是,如果你使用beginTrackingWithTouch,那是免费的。

我发现这通过实现beginTrackingWithTouch(用于自定义按钮控件),认为它只是处理touchesBegan的横向替换。所以在endTrackingWithTouch中,如果touchInside为true,我会调用sendActionsForControlEvents。最终的结果是这个动作被调用了两次,因为首先内建机制发出了动作,然后我调用它。就我而言,我只是在自定义突出显示方面很有趣,所以拿掉了对sendActionsForControlEvents的调用,并且都很好。

摘要:当您需要自定义跟踪时,使用beginTrackingWithTouch,并在需要自定义目标/操作处理(或其他低级细节)时使用touchesBegan。