我在一个视图控制器中有一个UIView,上面有一堆子视图(主要是UIButtons),当用户点击UIView之外我希望它被检测到,所以我可以运行一些代码。这个UIView是主视图控制器视图的子视图。
StackOverflow上的很多答案都指向透明UIButton覆盖整个视图控制器并在其上添加UIView并检测UIButton被点击的时间。
对我来说,这似乎有点hacky,但我可能是错的。我担心在未来发布的Apple可能会让它无法与透明对象或其他东西进行交互,这将破坏解决方案。
这真的是最好的解决方案吗?或者还有另一种方法可以做得更干净吗?
答案 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
中定义,UIViewController
和UIView
都继承自NSSet
。只要触摸未被当前对象之前的响应者链中的对象处理,就调用该方法。这意味着如果按钮上有触摸,则不会调用它。
第一个参数是UITouch
个UITouch
个对象。您可以使用- (CGPoint)locationInView:(UIView *)view
的方法{{1}}来告知该特定子视图的确切位置。如果位置(即返回的点)超出了视图的范围,则可以执行相应的代码。
答案 3 :(得分:0)
尝试使用UIControl类对象而不是UIView,并直接向其添加目标。