代码之家  ›  专栏  ›  技术社区  ›  Rudiger

检测某个uiview是否在其他uiview之间被触摸

  •  30
  • Rudiger  · 技术社区  · 14 年前

    我有3个ui视图,在一个大ui视图的顶部分层。我想知道用户是否接触到了顶部,而不关心其他的。我将在第二个uiview中有几个按钮,在第三个uiview中有一个uitable。

    问题是,我在第一个视图上启用了用户交互,这是可行的,但所有其他视图的响应方式都相同,即使我关闭了它。如果我禁用了在self.view上启用的userInteractionEnabled,它们都不会响应。我也无法检测在touchebegan委托方法中接触到的视图。

    我的代码:

    UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)];
    aView = userInteractionEnabled = YES;
    [self.view addSubview:aView];
    
    UIView *bView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 50)];
    bView.userInteractionEnabled = NO;
    [self.view addSubview:bView];
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //This gets called for a touch anywhere
    }
    
    7 回复  |  直到 6 年前
        1
  •  62
  •   Pawel    14 年前

    为了检查是否触摸了另一个视图中的某个视图,可以使用HitTest。

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
    

    在touchesbegan的自定义实现中,检查每个touch-in-touch集。HitTest方法的点可通过

    - (CGPoint)locationInView:(UIView *)view;
    

    方法,其中视图是超级视图(包含其他视图的视图)。

    编辑:下面是一个快速的自定义实现:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
        CGPoint locationPoint = [[touches anyObject] locationInView:self];
        UIView* viewYouWishToObtain = [self hitTest:locationPoint withEvent:event];
    }
    

    我希望这是有帮助的, 保罗

        2
  •  27
  •   rgadbois    13 年前

    在我的例子中,HitTest没有返回我想要查找的uiview。但是下面的代码工作得更好:

        CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
        CGPoint viewPoint = [myImage convertPoint:locationPoint fromView:self.view];
        if ([myImage pointInside:viewPoint withEvent:event]) {
           do something
        }
    
        3
  •  13
  •   Ben Baron    11 年前

    这也可以通过以下方式完成。

    首先在您关心的视图中找到触摸的位置:

    CGPoint location = [touches.anyObject locationInView:viewYouCareAbout];
    

    然后查看该点是否在视图边界内:

    BOOL withinBounds = CGRectContainsPoint(viewYouCareAbout.bounds, location);
    

    如果在范围内,执行您的操作。

    这可以通过一个语句来实现,例如,可以直接在if语句中使用该语句:

    CGRectContainsPoint(viewYouCareAbout.bounds, [touches.anyObject locationInView:viewYouCareAbout])
    
        4
  •  12
  •   Grzegorz Krukowski    8 年前

    银行代码:

     override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                if touch.view == self.view {
                    self.hideInView()
                } else {
                    return
                }
    
            }
        }
    
        5
  •  8
  •   Pichirichi    11 年前

    触摸开始 检查触摸视图是否是您想要的视图,当我试图确定用户是否触摸了特定的视图时,为我解决了问题。 图片框 .

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        if ([touch view] ==  imageView ) {
            ... your code to handle the touch
        }
        ...
    

    如果您调整视图直径的内容,请确保相应地更改视图大小,否则它将识别触摸事件,即使在视图中的内容所在的区域也是如此。在我的情况下,当我试图保持图像比例 uiviewcontentmodescaleaspectfit 虽然图像是按照“空白”区域的要求进行调整的,但触摸事件也被捕获。

        6
  •  3
  •   KerCodex    6 年前

    我的快速版本检查触摸发生在InfoView:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first, infoView.bounds.contains(touch.location(in: infoView))  else { return }
        print("touchesBegan") // Replace by your own code
    } // touchesBegan
    
        7
  •  0
  •   Andrew MasterUZ    8 年前

    这对我很有用:

    func respondToGesture(gesture: UIGestureRecognizer) {
        let containsPoint = CGRectContainsPoint(targetView.bounds, gesture.locationInView(targetView))
    }