Iphone 在某一点获得可见视图

Iphone 在某一点获得可见视图,iphone,ipad,uiview,Iphone,Ipad,Uiview,我在应用程序窗口的坐标中有一个点。 有没有一种方法可以使视图指针在该点可见 例如,我有100个视图或随机尺寸,并放置在随机位置-一些部分/完全相互覆盖 按下应用程序中的按钮将列出在(0,0)、(100100)和(200200)处可见的视图地址。 视图可能启用用户交互,也可能未启用用户交互。 另外,如果视图被完全透明的视图覆盖,那么更复杂的场景又如何呢?更新了 hitTest将不起作用,因为它不会为父级已将userInteractionEnabled设置为NO的子树或超出父级界限的视图提供子树 v

我在应用程序窗口的坐标中有一个点。
有没有一种方法可以使视图指针在该点可见

例如,我有100个视图或随机尺寸,并放置在随机位置-一些部分/完全相互覆盖
按下应用程序中的按钮将列出在(0,0)、(100100)和(200200)处可见的视图地址。
视图可能启用用户交互,也可能未启用用户交互。

另外,如果视图被完全透明的视图覆盖,那么更复杂的场景又如何呢?

更新了
hitTest
将不起作用,因为它不会为父级已将
userInteractionEnabled
设置为
NO
的子树或超出父级界限的视图提供子树

visibleViewAtPoint
将解析整个视图树,并给出具有最高子视图索引的视图。这应该给出正确的视图(不考虑z顺序…)


更新
hitTest
将不起作用,因为它不会为父级已将
userInteractionEnabled
设置为
NO
的子树或超出父级界限的视图提供子树

visibleViewAtPoint
将解析整个视图树,并给出具有最高子视图索引的视图。这应该给出正确的视图(不考虑z顺序…)


目前,此代码未检测到UIAlertView或其他“弹出”视图,如点击UIWebView中的下拉列表后显示的UIPickerView。这是该代码可以修改来完成的事情,还是属于“视图超出其父边界”的情况?如果是后者,您还可以如何检测和检索此类视图?UIAlertView维护自己的UIScreen,它将位于视图控制器视图之外,因此此方法不适用于此。您可能需要(以某种方式)跟踪UIAlertView的屏幕并在那里执行此方法。目前,此代码未检测到UIAlertView或其他“弹出”视图,如点击UIWebView中的下拉列表后显示的UIPickerView。这是该代码可以修改来完成的事情,还是属于“视图超出其父边界”的情况?如果是后者,您还可以如何检测和检索此类视图?UIAlertView维护自己的UIScreen,它将位于视图控制器视图之外,因此此方法不适用于此。您可能需要(以某种方式)跟踪UIAlertView的屏幕并在那里执行此方法。
- (void) findView:(UIView**)visibleView atPoint:(CGPoint)pt fromParent:(UIView*)parentView
{
    UIView *applicationWindowView = [[[[UIApplication sharedApplication] keyWindow] rootViewController] view];

    if(parentView == nil) {
        parentView = applicationWindowView;
    }

    for(UIView *view in parentView.subviews) 
    {        
        if((view.superview != nil) && (view.hidden == NO) && (view.alpha > 0)) 
        {
            CGPoint pointInView = [applicationWindowView convertPoint:pt toView:view];

            if([view pointInside:pointInView withEvent:nil]) {
                *visibleView = view;
            }

            [self findView:visibleView atPoint:pt fromParent:view];
        }
    }
}

- (UIView*) visibleViewAtPoint:(CGPoint)pt
{
    UIView *visibleView = nil;
    [self findView:&visibleView atPoint:pt fromParent:nil];

    return visibleView;
}