如何引用“最顶层”视图?

时间:2011-11-04 21:14:24

标签: ios uiview hierarchy

iOS中,以编程方式,如何找到最顶层 UIView是什么?

换句话说..现在显示什么视图?

说,我有一个笔尖,3个视图堆叠在一起。在程序内部,如果我知道它是什么,我可以删除顶视图。我怎样才能找到笔尖上的视图?

3 个答案:

答案 0 :(得分:10)

您可以拥有很多最顶层的视图,因为视图不必占用所有屏幕。

如果您想要视图的最顶层子视图,可以调用

[yourView subviews];

并取tje最后一个(它们按顺序显示,最后面的最后一个)

[[yourView subviews] objectAtIndex:[[yourView subviews] count]];

编辑:这是更好的(来自评论)

[[yourView subviews] lastObject];

如果您知道您显示的viewController只是通过yourController.view替换yourView

答案 1 :(得分:3)

喜欢这个

UIView *topMost = [[self.view subviews] lastObject];

答案 2 :(得分:3)

或者像这样

UIWindow *window = [[UIApplication sharedApplication].keyWindow;
UIView *topMost = [window findTopMostViewForPoint:CGPointMake(100, 100)];

功能

@implementation UIView (Extra)

- (UIView *)findTopMostViewForPoint:(CGPoint)point
{
    for(int i = self.subviews.count - 1; i >= 0; i--)
    {
        UIView *subview = [self.subviews objectAtIndex:i];
        if(!subview.hidden && CGRectContainsPoint(subview.frame, point))
        {
            CGPoint pointConverted = [self convertPoint:point toView:subview];
            return [subview findTopMostViewForPoint:pointConverted];
        }
    }

    return self;
}

- (BOOL)isTopmostViewInWindow
{
    if(self.window == nil)
    {
        return NO;
    }

    CGPoint centerPointInSelf = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
    CGPoint centerPointOfSelfInWindow = [self convertPoint:centerPointInSelf toView:self.window];
    UIView *view = [self.window findTopMostViewForPoint:centerPointOfSelfInWindow];
    BOOL isTopMost = view == self || [view isDescendantOfView:self];
    return isTopMost;
}

@end
相关问题