【问题标题】:Subclassing UIControl's endTracking for multitouch子类化 UIControl 的 endTracking 以实现多点触控
【发布时间】:2015-01-05 09:37:06
【问题描述】:

我通过继承 UIControl 并覆盖以下方法来创建自定义控件*:

  • - beginTrackingWithTouch:withEvent:
  • - continueTrackingWithTouch:withEvent:
  • - endTrackingWithTouch:withEvent:
  • - cancelTrackingWithEvent:

此控件将支持多点触控交互。具体来说,一根或两根手指可能会向下触摸,拖动一段时间,然后向上触摸,所有这些都是独立的。

我的问题出现在这些多点触控事件的结尾,endTrackingWithTouch:withEvent:。系统在我的控件上每个多点触控序列仅调用一次此方法,并且在发生的第一次触摸时调用它。这意味着将不再跟踪可能仍在拖动的第二次触摸。

这一系列的动作就是这种现象的一个例子:

  1. 手指A触地。 beginTracking 被调用。
  2. 手指A在左右拖动。 continueTracking 被反复调用以更新我的控件。
  3. 手指B触地。 beginTracking 被调用。
  4. 手指 AB 左右拖动。 continueTracking 被反复调用以更新我的控件。
  5. 手指B触碰。 endTracking 被调用。
  6. 手指A在左右拖动。不调用任何方法。
  7. 手指A触碰。不调用任何方法。

问题在于此序列的最后三个步骤。 The documentation for UIControl 表示endTrackingWithTouch:withEvent: 的以下内容:

当给定事件的最后一次触摸完全结束时发送到控件,告诉它停止跟踪。

但在我看来,在上述步骤 5 中手指 B 向上触摸之后,给定事件的最后一次触摸尚未完全结束。最后的触摸是手指A


*一个范围滑块,如果你一定要问的话。 但是已经有很多开源范围滑块了, 你说。是的,没错,但是这个将支持多点触控和自动布局。

【问题讨论】:

    标签: ios uikit multi-touch uicontrol


    【解决方案1】:

    我在使用多点触控的自定义控件中遇到了同样的问题。
    因为UIControlUIView的子类,继承自UIResponder,所以请随意使用:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
    

    方法。

    这些方法在UIControl 子类中运行良好。

    【讨论】:

    • 这是我现在正在研究的方法。但是,这意味着我需要覆盖tracking 变量以及touchInside 变量,因为我完全短路了UIControl 的触摸处理。此外,我必须覆盖 hitTest:withEvent: 以确保任何到达 touchesBegan:withEvent: 的触摸都是我想要处理的,因为那时我无法调用 super
    • 文档说:重写 beginTrackingWithTouch:withEvent:、continueTrackingWithTouch:withEvent:、endTrackingWithTouch:withEvent: 和 cancelTrackingWithEvent: 方法来跟踪控件中发生的触摸事件。您可以使用跟踪信息来执行其他操作。 始终使用这些方法而不是 UIResponder 类定义的方法来跟踪触摸事件。
    • @DamianRzeszot 你有没有找到解决方案,同时坚持文档中所述的被覆盖方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多