0

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

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

对我来说,这似乎有点 hacky,但我可能是错的。恐怕在未来的版本中,Apple 可能会让你无法与透明对象或其他东西进行交互,这会破坏解决方案。

这真的是最好的解决方案吗?还是有另一种更干净的方法?

4

4 回答 4

1

是的,添加按钮不是一个好的解决方案,有一些特殊的类是为此: TapGesture

于 2013-05-27T17:10:43.433 回答
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
    }   
}
于 2013-05-28T12:58:25.180 回答
0

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

第一个参数是一个NSSet对象UITouch。您可以使用UITouch' 方法- (CGPoint)locationInView:(UIView *)view从该特定子视图中分辨出确切位置。如果位置(即返回的点)超出了视图的范围,那么您可以执行相应的代码。

于 2013-05-27T17:09:38.253 回答
0

尝试使用UIControl类对象而不是 UIView 并将目标直接添加到它。

于 2013-05-27T18:55:46.843 回答