如何通过命中测试确定UIView是否被遮挡或部分离屏?

时间:2015-07-15 08:57:43

标签: ios objective-c ios7 uiview

我正在寻找一种方法来测试UIView是否(部分)被UIActionSheet,UIAlertView,HUD等遮挡,或者是否(部分地)在滑动面板UIScrollView中屏幕外(U)等等。这需要是一个通用的解决方案,因为有太多方法来模糊视图。

我想到的是在UIView应该在的关键点执行一些命中测试,并检查给定UIView的数量(如果有的话)。

示例:想象一下,下图中没有手。我想在手指处进行程序化命中测试。如果未返回View A.2,则会隐藏它。

touch event

我已查看过hit tests with touch events,但我怎么能以编程方式执行点击测试,看看哪个UIView被点击没有物理触摸事件

参考文献:

1 个答案:

答案 0 :(得分:0)

我找到了一个答案。

首先,将要执行命中测试的视图的坐标(让我们使用UIView *testView)转换为屏幕坐标的坐标。

CGPoint screenOrigin = 
     [testView.superview convertPoint:testView.frame.origin 
                               toView:nil];

接下来,制作几个测试生命点(例如,视图的左上角和右下角)。这是一个测试点的示例。

CGPoint hitTestPoint = CGPointMake(30, screenOrigin.y + 30); // upper left

然后找到最顶层的窗口 * 并在其上调用hitTest:withEvent:。该活动可能是零。

UIView *hitTest = [mainWindow hitTest:hitTestPoint withEvent:nil];

然后检查hitTest结果是否等于testView

if (testView && [testView isEqual:hitTest] /* && [testView isEqual:hitTest2] */) {
    // The view is not obscured nor off the screen in a sliding panel
}

*找到最顶层的窗口仍为an open question,但对于大多数人来说,这样的事情可能会有效:

UIWindow *mainWindow = [[[UIApplication sharedApplication] windows] firstObject]