我有一个主视图控制器。其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
拦截其触摸。
答案 0 :(得分:0)
如果你停止覆盖hitTest:withEvent:
,你可能会发现更容易做到这一点。如果您不覆盖它,它会默认将这些触摸传递给您的子视图控制器;在这里混合实际的事件处理是很尴尬的。 (确定哪个子视图应该获得该事件是该方法的工作,因此您无法阻止它接收发往子视图的事件。)
相反,您可能希望在主视图中创建UIControl
并使用其触发的操作或覆盖其beginTrackingTouches:withEvent:
方法以创建子视图控制器。