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