我正在寻找一种方法来测试UIView是否(部分)被UIActionSheet,UIAlertView,HUD等遮挡,或者是否(部分地)在滑动面板UIScrollView中屏幕外(U)等等。这需要是一个通用的解决方案,因为有太多方法来模糊视图。
我想到的是在UIView应该在的关键点执行一些命中测试,并检查给定UIView的数量(如果有的话)。
示例:想象一下,下图中没有手。我想在手指处进行程序化命中测试。如果未返回View A.2
,则会隐藏它。
我已查看过hit tests with touch events,但我怎么能以编程方式执行点击测试,看看哪个UIView被点击没有物理触摸事件?
参考文献:
答案 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]