UIView. 如何快速查找根SuperView?

19

在视图层次结构中,我有一个随机的子视图。最好/最快/最聪明的方法是什么,以便可以到达根超级视图?

谢谢,
道格

4个回答

26

如果你的应用只有一个 UIWindow(通常是这样),并且该窗口唯一的子视图是根控制器的视图(也通常是这样):

[randomChildView.window.subviews objectAtIndex:0]

或者您可以通过检查 view.superview 直到找到其父视图为 nil 的视图来递归地向上跳出层次结构。


2
你可能需要仔细检查一下,是否会出现“superview为nil”的情况。我曾尝试过这样做,结果陷入了无限循环。 - finneycanhelp
爬山算法的替代只需要几个微不足道的处理器周期,而且您不需要做任何假设。我不会得到无限循环。 - TJez

12

直接访问父视图层次结构所需的处理器时间很少。我在我的UIView类别中使用这个方法。

- (UIView *)rootView {
    UIView *view = self;
    while (view.superview != Nil) {
        view = view.superview;
    }
    return view;
}

Swift 3/4:

func rootSuperView() -> UIView
{
    var view = self
    while let s = view.superview {
        view = s
    }
    return view
}

1
你的方法总是返回 self.window - DUzun
不,它会在层次结构中找到最高的UIView元素。当然,如果你只在self.window下运行它,它只会返回self.window。 - TJez

1
快速解决方案(快速指极简主义):
extension UIView {
    var rootView: UIView {
        superview?.rootView ?? self
    }
}

1
我喜欢这个。
extension UIView {
    func rootView() -> UIView {
        return superview?.rootView() ?? superview ?? self
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接