阻止父视图控制器在子控制器中接收UITouch

时间:2015-11-18 02:19:28

标签: ios objective-c parent-child uitouch uiresponder

所以,在我的应用程序中,然后按下地图注释,它会显示一个模态视图控制器。然后当按下模态控制器的元素时,我打开另一个较小的控制器。在两个控制器中,我已经实现了方法

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint touchPoint = [touch locationInView:self.view];

    if (!CGRectContainsPoint([self.view viewWithTag:21].frame, touchPoint)) {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

这是一张显示我的布局的图片: Layout Image

我的问题是当我触摸黄色圆圈时,第二个模态解散,然后,第一个模态解散。那么,我该如何防止第一个模态接收到触摸。

PS:两个模态都是透明的UIViews,内部有较小的视图来显示内容。

1 个答案:

答案 0 :(得分:1)

显然,事件通过视图控制器传递给下一个响应者。

在UIResponder的课堂参考中。

  

此方法的默认实现不执行任何操作。然而   UIR应答器的UIKit子类,特别是UIView,   将消息转发到响应者链。要将邮件转发到   下一个响应者,将消息发送到super(超类   实现);不要将消息直接发送到下一个   响应者。例如,

     

[super touchesMoved:touches withEvent:event];

     

如果在不调用super的情况下覆盖此方法(常用)   pattern),你还必须覆盖其他处理触摸的方法   事件,如果仅作为存根(空)实现。

因此,如果您不希望事件转发给下一个响应者,则应覆盖其他方法。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    if (!CGRectContainsPoint([self.view viewWithTag:21].frame, touchPoint)) {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}