Ios hitTest正在拦截来自子控制器的触摸
我有一个主视图控制器。它的Ios hitTest正在拦截来自子控制器的触摸,ios,objective-c,model-view-controller,uiviewcontroller,uitouch,Ios,Objective C,Model View Controller,Uiviewcontroller,Uitouch,我有一个主视图控制器。它的视图处理命中测试 因此,当触摸到特定点时,我会创建另一个控制器,并将此控制器添加到主视图控制器,如下所示: [self addChildViewController:childController]; [childController didMoveToParentViewController:self]; [self.view addSubview:childController.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];
}
}
触摸验证:
主控制器添加另一个控制器作为childController,其触摸被主控制器视图中的hitTest
截获
如果停止重写
hitTest:withEvent:
,您可能会发现这更容易实现。默认情况下,如果您不覆盖它,它会将这些触摸传递给您的子视图控制器;在这里混合实际的事件处理是很尴尬的。(该方法的任务是确定哪个子视图应该获取事件,因此不能阻止它接收指定给子视图的事件。)
相反,您可能希望在主视图中创建一个
UIControl
,并使用其触发的操作或覆盖其BeginTrackingTouchs:withEvent:
方法来创建子视图控制器 您是说希望创建子视图控制器的触摸也由子视图控制器处理吗?或者您的意思是只希望后续的触摸传递到子视图控制器?另外,代码中的视图
是什么?@JesseRusak是的,一旦添加了子视图控制器,我希望它能够接收触摸,但是当前hitTest
(在主控制器视图中)正在获得所有触摸,即使子视图控制器及其视图已添加,如图所示<代码>视图是一个数组,工作正常。谢谢。请您再详细说明一下,因为我从未使用过BeginTouchs:withEvent:
,我将如何使用它将触摸传递给子控制器,当子视图控制器不再在视图中时,让它放弃触摸,并且主控制器再次控制触摸?我是说,hitTest:withEvent:
的默认实现将正确地将触摸传递给子视图控制器可见,并在移除触摸时停止向其传递触摸。您只需使用addSubview:
将它们添加到视图中即可BeginTrackingTouchs:withEvent:
将为您提供一个放置代码以添加子vcs的位置。您尝试过我的建议吗?您确定在您的子视图控制器上没有其他视图正在接受事件吗?
\
[view] (handles hitTest)