我在视图控制器中显示了一个UIView,如何检测用户何时在此视图外部轻敲?

时间:2013-05-27 16:18:39

标签: ios objective-c uiview uiviewcontroller uitapgesturerecognizer

我在一个视图控制器中有一个UIView,上面有一堆子视图(主要是UIButtons),当用户点击UIView之外我希望它被检测到,所以我可以运行一些代码。这个UIView是主视图控制器视图的子视图。

StackOverflow上的很多答案都指向透明UIButton覆盖整个视图控制器并在其上添加UIView并检测UIButton被点击的时间。

对我来说,这似乎有点hacky,但我可能是错的。我担心在未来发布的Apple可能会让它无法与透明对象或其他东西进行交互,这将破坏解决方案。

这真的是最好的解决方案吗?或者还有另一种方法可以做得更干净吗?

4 个答案:

答案 0 :(得分:1)

是的,添加Button不是一个好的解决方案,有以下特殊类: TapGesture

答案 1 :(得分:1)

假设视图控制器中的uiview名为view1

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint p = [touch locationInView:view1];


    if (!CGRectContainsPoint(view1.frame, p)) {//when touched out of view1
       //do action
    }   
}

答案 2 :(得分:0)

透明按钮确实不是一个糟糕的解决方案。但是,如果您需要使用其他解决方案,则可以使用方法- (void) touchesBegan:withEvent:。它在UIResponder中定义,UIViewControllerUIView都继承自NSSet。只要触摸未被当前对象之前的响应者链中的对象处理,就调用该方法。这意味着如果按钮上有触摸,则不会调用它。

第一个参数是UITouchUITouch个对象。您可以使用- (CGPoint)locationInView:(UIView *)view的方法{{1}}来告知该特定子视图的确切位置。如果位置(即返回的点)超出了视图的范围,则可以执行相应的代码。

答案 3 :(得分:0)

尝试使用UIControl类对象而不是UIView,并直接向其添加目标。