【问题标题】:iOS Receiving superview's touches events in it's subviewiOS 在其子视图中接收超级视图的触摸事件
【发布时间】:2015-01-13 13:21:13
【问题描述】:

问题: 有没有办法在其子视图中直接接收来自父视图的触摸(即触摸子视图边界之外的触摸)? p>

我想避免委托(正式/非正式)、NSNotification、代理或任何其他将触摸事件从一个视图转发到另一个视图的中间解决方案。

【问题讨论】:

  • 别无他法。阅读有关 UIResponderChain 的理论。
  • 我读过它并没有直接说它不可能。它甚至暗示这是返回 BOOL 值的问题 pointInside:withEvent:, 引用:“如果传递给 hitTest:withEvent: 的点不在视图的范围内,则第一次调用 pointInside:withEvent: 方法返回 NO,该点被忽略,并且 hitTest:withEvent: 返回 nil。"

标签: ios objective-c uiview uiresponder


【解决方案1】:

这样就可以了。在子视图中覆盖 pointInside。希望能直接满足您的要求。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
   point = [self convertPoint:point toCoordinateSpace:self.superview];
    CGRect frame = self.superview.frame;
    if (CGRectContainsPoint(frame, point)) {
        return YES;
    }
    return [super pointInside:point withEvent:event];
}

【讨论】:

  • 非常感谢!使用此方法子类化的 SKView 完美运行。
  • 不幸的是,我发现了一个问题:有时条件不满足但无条件返回 YES 修复它(?)。有什么想法吗?我的 UIView 树是: UIView A (root) > UIView B > UIView C > UIView D over SKView 在同一个节点。仅从自身和 UIView C 接收 SKView 中的触摸。
  • @KrzysztofPrzygoda - 我希望这是您的视图层次结构的一些问题,但我无法从您的评论中充分说明。我建议您尝试记录点和框架以找出导致它失败的条件。另请参阅event deliverythis nice write-up on smnh.me 的苹果指南
  • 感谢您提供的链接 - 非常好(希望 Apple 这样做了 - 我真的觉得他们错过了用例)。我发现对我来说最简单的解决方案是覆盖 pointInside:withEvent: 始终返回 YES。唯一的痛苦是任何解决方案都适用于超级视图,但不适用于主/根视图。因此,我必须将树中的每个 UIView 子类化到所需的层次结构级别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多