【问题标题】:hitTest is intercepting touches from child controllerhitTest 正在拦截来自子控制器的触摸
【发布时间】:2014-04-17 13:04:56
【问题描述】:

我有一个主视图控制器。它的view 处理hitTest

所以当一个特定点被触摸时,我会创建另一个控制器并将这个控制器添加到主视图控制器,如下所示:

[self addChildViewController:childController];
[childController didMoveToParentViewController:self];
[self.view addSubview:childController.view];

它可以工作,但我最大的问题是主视图仍在拦截其hitTest 中的所有触摸。

这是我的hitTest 实现:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{                
    for(int x = 0; x < [views count]; x++)
    {    
        NSValue *encodedRect = [views objectAtIndex:x];
        CGRect rect;
        [encodedRect getValue:&rect];

        if(CGRectContainsPoint(rect, point))
        {
            foundTheTouchedPoint = YES;
            return;
        }
    }

    if(foundTheTouchedPoint)
    {
        //This is a method where [self addChildViewController..]; etc takes place
        [self.myController createChildController];

        return self.myController.controller.view;
        //myController is the controller of this view.
        //controller is a property of myController, whose view I would like to 
        //receive touch once the touch validates.
    }
    else
    {
        return [super hitTest:point withEvent:event];
    }
}

我只是希望能够使用hitTest 来测试触摸,一旦触摸验证,我会将子视图控制器及其视图添加为子视图并让它接收触摸(不是主视图)。它一直让我发疯。请让我知道我在这里做错了什么。

另一件事是:我认为我的设计在这里是错误的,因为这个视图不应该/不需要抓住它的控制器 (myController)。但是我需要能够从myController 中的hitTest 返回控制器的视图(controller),这就是我这样做的原因。

虽然我的直觉告诉我我的设计是错误的,但我不知道如何更好地设计它。但这将是第二步,现在我希望能够让该控制器 (controller) 在添加后接收触摸。

当前控制器/视图层次结构:

[主控制器]

    \

 [view] (handles hitTest)

触摸验证:

主控制器添加另一个控制器作为childController,其触摸被hitTest在主控制器视图中拦截。

【问题讨论】:

  • 您是说您希望创建子视图控制器的触摸由子视图控制器处理吗?或者您是说您只想将后续触摸传递给子视图控制器?另外,您的代码中的views 是什么?
  • @JesseRusak 是的,一旦添加了子视图控制器,我希望它能够接收触摸,但目前hitTest(在主控制器的视图中)正在获得所有触摸,即使子视图如图所示添加控制器及其视图。 views 是一个数组,它工作正常。谢谢。

标签: ios objective-c model-view-controller uiviewcontroller uitouch


【解决方案1】:

如果您停止覆盖hitTest:withEvent:,您可能会发现更容易完成这项工作。如果您不覆盖它,它将默认将这些触摸传递给您的子视图控制器;在这里混合实际事件处理很尴尬。 (确定哪个子视图应该获取事件是该方法的工作,因此您不能阻止它接收发往子视图的事件。)

相反,您可能想在主视图中创建一个UIControl 并使用其触发的操作或覆盖其beginTrackingTouches:withEvent: 方法以创建子视图控制器。

【讨论】:

  • 您能否详细说明一下,因为我从未使用过beginTrackingTouches:withEvent:,我将如何使用它来将触摸传递给子控制器以及当子视图控制器不再需要它时放弃触摸,主控制器再次控制触摸?
  • 我的意思是hitTest:withEvent: 的默认实现将在子视图控制器可见时正确地将触摸传递给它们,并在它们被删除时停止传递触摸。您需要做的就是使用addSubview: 将它们添加到视图中,就像您现在一样。 beginTrackingTouches:withEvent: 只会给您一个放置代码以添加子 vcs 的地方。
  • 你试过我的建议了吗?您确定在您的子视图控制器之上没有另一个视图正在接受该事件吗?
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
相关资源
最近更新 更多