如何在子元素上启用用户交互但忽略父级上的用户交互?

时间:2014-09-12 01:24:45

标签: ios cocoa-touch event-handling

在下图中,S,P,C是UIView的所有子类。 C是P的孩子.P是S的孩子。我想要S和C来回应触摸,但我希望P忽略所有触摸并将它们传播到S。

 _____________________
| S                  |
|  ______________    |
| | P            |   |
| |              |   |
| |  ___         |   |
| | |   |        |   |
| | | C |        |   |
| | |___|   ___  |   |
| |        |   | |   |
| |        | C | |   |
| |        |___| |   |
| |______________|   |
|____________________|

我不能只做p.userInteractionEnabled = NO,因为这也会禁用C语言。

如果您想知道为什么我需要这样做,我希望有一个类似于Facebook聊天头的结构。头像,关闭按钮和评论模糊可以是我的C.它们都可以用P包裹,它具有透明背景并占据整个屏幕。 P是仅处理聊天逻辑的UIViewController的主视图。假设用户试图点击Like按钮(由S拥有)。然后P不应该阻止那个点击 - 它应该让S处理它。

enter image description here

2 个答案:

答案 0 :(得分:3)

你可以子类化UIView并覆盖 - pointInside:withEvent:如下所示。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint localPoint = [self convertPoint:point fromView:self];
    for (UIView *subview in self.subviews) {
        if ([subview pointInside:localPoint withEvent:event]) {
            return YES;
        }
    }
    return NO;
}

答案 1 :(得分:0)

我会尝试将P一起切出画面,我不确定它作为容器的用途是什么。如果您希望同时管理多个C,请尝试将它们放入数组或IBOutletCollection(如果它们是IBOutlets)。您通常不希望屏幕上有两个viewControllers,具有相同的框架,两者同时可见(几乎完全是出于这个原因)。您可以考虑使用一个chatModel对象,它可以根据需要向S的viewController提供所需的信息,并让S直接呈现Cs。