我有一个UIViewController子类,其视图通常包含一些UIButtons和其他交互元素,这些元素可能附加了一个或多个手势识别。
我尝试做的是在用户点击非交互式屏幕的一部分时提供一些视觉反馈。换句话说:当用户在任何地方点击屏幕时,当且仅当视图中没有其他控件响应触摸事件时(包括它是否,例如,拖动的开始),那么我想要开火关于基于水龙头位置的方法。
是否有一种直接的方法来执行此操作,不要求我将任何其他逻辑附加到视图中的交互元素,或者至少允许我通过遍历来自动附加此类逻辑查看层次结构?
答案 0 :(得分:1)
如果在点击位置下有交互元素,则可以覆盖容器视图的pointInside:withEvent:
方法并返回NO
,否则返回YES
。返回YES
的情况将对应于点击空白位置。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// Perform some checks using the CGRectContainsPoint method
// e.g. CGRectContainsPoint(oneOftheSubviews.frame, point)
}
一个很好的选择是使用hitTest:withEvent:
方法,如下例所示:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *hitView = [super hitTest:point withEvent:event];
if (hitView != someView) return nil;
return hitView;
}
[super hitTest:point withEvent:event]
将返回该视图中已挖掘的层次结构中最深的视图。
因此,您可以检查hitView
的类型,如果它与您的某个互动子视图相对应,则返回它。如果它等于self
,则表示在点击位置下没有子视图,在您的情况下意味着用户点击了空白区域。在这种情况下,您将做任何您想做的事情,然后返回nil
。