Ios 如何通过点击测试确定UIView是否被遮挡或部分脱离屏幕?

Ios 如何通过点击测试确定UIView是否被遮挡或部分脱离屏幕?,ios,objective-c,ios7,uiview,Ios,Objective C,Ios7,Uiview,我正在寻找一种方法来测试UIView是否(部分)被UIActionSheet、UIAlertView、HUD等遮挡,或者是否(部分)在滑动面板、UIScrollView等中脱离屏幕。。这需要是一个通用的解决方案,因为有太多的方法来模糊视图 我想到的是在UIView应该位于的关键点执行一些命中测试,并检查有多少(如果有的话)命中给定的UIView 示例:想象下图中没有手。我想在手指所在的位置执行一个程序化的命中测试。如果未返回视图A.2,则该视图将被遮挡 我已经研究过了,但是如何通过编程执行命中

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

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

示例:想象下图中没有手。我想在手指所在的位置执行一个程序化的命中测试。如果未返回
视图A.2
,则该视图将被遮挡

我已经研究过了,但是如何通过编程执行命中测试,并在没有物理触摸事件的情况下查看哪个UIView被命中

参考资料:

    • 我找到了一个答案

      首先,将要执行命中测试的视图坐标(让我们使用
      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
      }
      

      *找到最上面的窗口仍然很困难,但对于大多数人来说,这样做可能会奏效:

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