iPhone - 判断触摸是否发生在UIView的子视图中

9
在UIView的子类中,我有以下代码:
    -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
       if(touch occurred in a subview){
         return YES;
       }

       return NO;
    }

我要在if语句中放什么?我想检测触摸是否发生在子视图中,而不管它是否位于UIView的框架内。

4个回答

12

试试这个:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return CGRectContainsPoint(subview.frame, point);
}

如果你想在实现这个方法的视图范围内返回YES,可以使用以下代码:(如果你想将手势识别器添加到一个位于容器边界外部的子视图中)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if ([super pointInside:point withEvent:event])
    {
        return YES;
    }
    else
    {
        return CGRectContainsPoint(subview.frame, point);
    }
}

2
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
   return ([self hitTest:point withEvent:nil] == yourSubclass)
}

方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 返回接收器在视图层次结构中(包括自身)包含指定点的最远后代。 我所做的是将最远下方的视图与您的子视图进行比较,并返回比较结果。 如果您的子视图还有子视图,则此方法可能无法正常工作。 在这种情况下,您需要执行以下操作:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
   return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass])
}

但是这个方法是UIView的子类,所以会崩溃: - sol
抱歉,我猜我需要添加一个答案来解释 - 请见下文 - sol

1

TRY THIS:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
   NSSet *touches = [event allTouches];
   UITouch *touch = [touches anyObject];
   if([touch.view isKindOfClass:[self class]]) {
   return YES;
   }
   return NO;
}

0

Swift 版本:

  var yourSubview: UIView!

  override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    return subviewAtPoint(point) == yourSubview 
  }

  private func subviewAtPoint(point: CGPoint) -> UIView? {
    for subview in subviews {
      let view = subview.hitTest(point, withEvent: nil)
      if view != nil {
        return view
      }
    }
    return nil
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接