hitTest拦截来自子控制器的触摸

时间:2014-04-17 13:04:57

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

我有一个主视图控制器。其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) 。但我需要能够从controller中的myController返回控制器的视图(hitTest),这就是我这样做的原因。

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

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

  

[主控制器]

    \

 [view] (handles hitTest)
     

触摸验证:

     

主控制器将另一个控制器添加为childController,其主要控制器正在hitTest拦截其触摸。

1 个答案:

答案 0 :(得分:0)

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

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