UIView. How Do I Find the Root SuperView Fast?
Asked Answered
G

4

19

I have a random child view in a view hierarchy. What is the best/fastest/cleverest way to get to the root superview?

Cheers,
Doug

Gahnite answered 28/5, 2011 at 23:25 Comment(0)
K
26

If your app only has one UIWindow (usually true), and if that window's only subview is your root controller's view (also usually true):

[randomChildView.window.subviews objectAtIndex:0]

Or you could recursively climb out of the hierarchy, by checking view.superview until you find a view whose superview is nil.

Kidding answered 29/5, 2011 at 0:5 Comment(2)
You may want to double check that you will ever find that a "superview is nil" I tried that and got stuck in an infinite loop.Expositor
The alternate of climbing only takes a few insignificant processor cycles, and you don't need to assume anything. I don't get an infinite loop.Delirious
D
12

It's an insignificant amount of processor time to go straight up the superview hierarchy. I have this in my UIView category.

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

swift3/4:

func rootSuperView() -> UIView
{
    var view = self
    while let s = view.superview {
        view = s
    }
    return view
}
Delirious answered 8/11, 2013 at 13:52 Comment(2)
Your method always returns self.windowRosinweed
No, it will find the highest UIView element in the hierarchy. Of course if you only run it on views that are under self.window it will only return self.window.Delirious
J
2

Fast solution (fast as in minimalist):

extension UIView {
    var rootView: UIView {
        superview?.rootView ?? self
    }
}
Juttajutty answered 27/2, 2021 at 14:26 Comment(0)
H
1

I like this one.

extension UIView {
    func rootView() -> UIView {
        return superview?.rootView() ?? superview ?? self
    }
}
Highborn answered 30/5, 2018 at 13:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.