在某个时刻获取可见视图

1 iphone uiview ipad

我在应用程序窗口的坐标中有一个点CGPoint.
有没有办法在该点获得指向视图的指针?

例如,我有100个视图或随机大小,并放置在随机位置 - 一些部分/完全覆盖彼此.
按下应用程序中的按钮将列出在(0,0),(100,100)和(200,200)处可见的视图的地址.
视图可能启用了userInteraction,也可能没有启用.
此外,完全透明视图覆盖视图的更复杂情况又如何呢?

LK.*_*LK. 7

更新
hitTest将无法正常工作,因为它不会为您提供父级已userInteractionEnabled设置的子树NO或超出其父级边界的视图.

visibleViewAtPoint如下所述,将解析整个视图树并为视图提供最高的子视图索引.这应该给出正确的视图(不考虑z顺序...)

- (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;
}
Run Code Online (Sandbox Code Playgroud)