界面视图。如何快速找到根 SuperView?

Posted

技术标签:

【中文标题】界面视图。如何快速找到根 SuperView?【英文标题】:UIView. How Do I Find the Root SuperView Fast? 【发布时间】:2011-05-28 23:25:35 【问题描述】:

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

干杯, 道格

【问题讨论】:

【参考方案1】:

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

[randomChildView.window.subviews objectAtIndex:0]

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

【讨论】:

您可能需要仔细检查您是否会发现“superview is nil”我尝试过并陷入无限循环。 爬升的替代只需要几个微不足道的处理器周期,你不需要假设任何事情。我没有无限循环。【参考方案2】:

直接进入超级视图层次结构所需的处理器时间是微不足道的。我的 UIView 类别中有这个。

- (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

【讨论】:

你的方法总是返回self.window 不,它会找到层次结构中最高的 UIView 元素。当然,如果你只在 self.window 下的视图上运行它,它只会返回 self.window。【参考方案3】:

我喜欢这个。

extension UIView 
    func rootView() -> UIView 
        return superview?.rootView() ?? superview ?? self
    

【讨论】:

【参考方案4】:

快速解决方案(极简主义中的快速):

extension UIView 
    var rootView: UIView 
        superview?.rootView ?? self
    

【讨论】:

以上是关于界面视图。如何快速找到根 SuperView?的主要内容,如果未能解决你的问题,请参考以下文章

不能等于 Xcode 11 中的 Superview 的高度

如何在 Superview 的视图中插入视图? (iOS)

如何从 iPad 中的子视图更新 Superview?

iOS - superView 的相对顶部空间

如果涉及superview,则不会排除子视图点击的UIScrollView

如何允许某些手势通过 superview 到它下面的视图?