【问题标题】:How to track UITouches between two UIViewcontrollers? (using containment)如何跟踪两个 UIView 控制器之间的 UITouches? (使用遏制)
【发布时间】:2012-08-11 19:47:33
【问题描述】:

我有两个视图控制器同时出现在屏幕上,使用视图控制器包含,实现方式与 Apple 的代码示例相同。将它们称为视图控制器 A (vcA) 和视图控制器 B (vcB),以及容器视图控制器 (containerVC)。

每个 vcA 和 vcB 都有一个对象网格,我希望能够将对象从 vcA 拖动到 vcB。更具体地说,我希望源自 vcA 的触摸在 vcB 中的 touchesMoved:withEvent 方法到达边界 vcB 内。

我已经覆盖了 containerVC 上的 touchesMoved:withEvent 方法,通过命中测试跟踪触摸,并尝试将触摸向下转发到 UIView 层次结构,如下所示:

// in the containerVC
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
    UIView* touchIsInViewControllerA = [vcA hitTest:locationPoint withEvent:event];
    if (touchIsInViewControllerA) {
        NSLog(@"Touch is in vcA");
        return;
    }
    UIView* touchIsInViewControllerB = [vcB hitTest:locationPoint withEvent:event];
    if (touchIsInViewControllerB) {
        NSLog(@"Touch is in vcB");
        [vcB touchesMoved:touches withEvent:event]; // this causes a crash
    }
}

这似乎是递归的,containerVC 将触摸事件向下推送到层次结构,然后 vcB 将触摸事件向上传递到层次结构。

我的问题:有没有办法阻止 vcB 将触摸事件传递回响应者链到 containerVC?或者我应该以不同的方式处理这个问题 - 让 vcB 成为 vcA 的代表,而让 containerVC 不在等式中?

注意:我猜一个常见的反应是放弃 VC 包含模式并将其全部保存在一个视图控制器中,但出于此示例中未显示的原因,我认为将它们分开对我来说会更好 - 除非这样做是完全精神错乱和超级hacky......

【问题讨论】:

    标签: cocoa-touch ios5 uiviewcontroller uitouch


    【解决方案1】:

    这个问题可以通过为每个视图控制器设置单独的手势对象来轻松解决。

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
     if (touchIsInViewControllerA) {
    
    // calls a delegate of view controller A
    
      }
    else
     {
    
    // calls a delegate of view controller B
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2020-11-23
      • 1970-01-01
      • 2020-02-05
      • 2013-05-15
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多