有人可以解释这两种方法之间的高层差异吗?特别是,何时使用一个而不是另一个,这些方法的目的是否有任何重叠? 他们看起来似乎是出于同样的目的,但在文档中似乎根本没有关联,这让我很困惑。
答案 0 :(得分: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对象,或者刚刚从屏幕上抬起。
答案 1 :(得分:3)
今天遇到这个问题,我认为关键的区别在于,beginTrackingWithTouch和朋友只是为了跟踪 - 而不是其他任何东西 - 尤其不是目标/动作处理。因此,如果您覆盖touchesBegan,那么当触摸结束时,您还要负责调用sendActionsForControlEvents。但是如果你使用beginTrackingWithTouch,那就免费处理了。
我通过实现beginTrackingWithTouch(用于自定义按钮控件)发现这一点,认为它只是处理touchesBegan的侧面替代品。所以在endTrackingWithTouch中,如果touchInside为true,我调用了sendActionsForControlEvents。最终结果是该动作被调用了两次,因为首先内置机制发送了动作,然后我调用了它。在我的例子中,我只是在定制突出显示方面很有趣,所以取消了对sendActionsForControlEvents的调用,一切都很好。
总结:当你需要做的就是自定义跟踪时,使用beginTrackingWithTouch,当你需要自定义目标/动作处理(或其他低级细节)时,使用touchesBegan。
答案 2 :(得分:0)
如果我正确理解Apple文档:
beginTracking:
使用提供的事件信息来检测控件的哪个部分被命中并设置任何初始状态信息
因此,更多用于控制状态配置。
touchesBegan:
许多UIKit类都重写此方法,并使用它来处理相应的触摸事件
此方法更多用于触摸事件处理。