繁体   English   中英

你将如何重新实现UIControl? 它如何适应响应者链?

[英]How would you reimplement UIControl? How does it fit into the responder chain?

如果我重写UIKit,我将如何实现UIControl?

我在使用UIControl进入触摸处理和响应链的概念性理解方面遇到了一些麻烦。 具体来说,我很担心谁负责调用UIControl的begincontinueendTrackingWithTouch:withEvent调用。

我天真的解释是,UIControl负责处理触摸事件,如touchesBegan:任何其他子类UIR touchesBegan:以及相关方法。 然而,这将变得复杂,因为触摸事件仍然与首先处理它的视图相关联,并且这将产生这样的情况:源自按钮但在屏幕上作为平移继续的触摸将继续由该按钮处理,这似乎违反直觉。 在这种情况下,我可以想象按钮可以开始将这些触摸事件转发到其超级视图,但这看起来很难看。 由于UIControlEvents(例如touchUpInside)表明正在其他地方处理触摸并且UIControl仅被通知了谨慎的事件,因此这一切也有点令人困惑。

我最好的猜测是,在查看视图-heirarchy以找到响应者时,UIControls的处理方式不同,并且最顶层的非控制响应者检查其任何子视图都是UIControls,然后根据需要调用正确的方法,但这似乎有点奇怪。

有没有人对这一点有任何指导或澄清? 我稍微挖了一下文档,但没有发现任何明确的内容。

UIControl是UIView的子类,因此它可以检测用户交互,并使用目标操作模式来调用对象/目标上的某些方法/操作。

正如你所说的那样,以Apple的方式说: “一个事件沿着特定的路径前进, 寻找一个可以处理它的对象”

所以UIControl的基本工作流程:

  • UIControl检测基本事件( UIControlEventTouchDownUIControlEventTouchCancel ...),该事件由链响应者工作流程处理。

  • addTarget:action:forControlEvents:告诉UIControl在目标上调用事件类型参数的操作。

  • 当eventType和目标匹配时,操作将被触发。

编辑

UIControl只是一个为实现它的对象提供目标/操作模式行为的接口。

所以真正发生的是当你触摸屏幕时,有一个基本的UIEvent,它是用时间戳,类型(触摸,运动或远程控制)和子类型创建的。

iOS将收集与此事件相关的所有UITouch (一个UITouch =一个手指触摸动作)。 UITouch包含触摸发生的UIViewUIWindow以及其他内容。

UIEvent有三个功能:

  • allTouches() :返回UITouchNSSet
  • touchesForView(aView) :为特定的UIView返回一个UITouchNSSet
  • touchesForWindow(aWindow) :返回特定UIWindowUITouchNSSet

根据我的理解,当事件被触发时,系统会将其发送到您的UIApplication ,它会将事件发送到FirstResponderChain工作流程。

因此,我认为当在View Hierarchy中进行下去时,它会检查touchesForView方法是否返回一些东西,如果它返回了一些东西,然后它调用实现UIResponderUIView上的相应方法,那么它可以调用touchesBegan:withEvent: for例。 此外,它继续前进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM