将子视图置于一切之上,但低于另一个 UIView

Posted

技术标签:

【中文标题】将子视图置于一切之上,但低于另一个 UIView【英文标题】:Bring Subview Above Everything But Below Another UIView 【发布时间】:2016-05-31 20:25:19 【问题描述】:

我试图在顶部放置一个UIView - popupView,在 popupView 下方放置另一个 UIView (opaqueView),但高于其他任何东西。 PopUpView 与 Outlet 相连。

func display() 
    popupView.center = CGPointMake(CGRectGetMidX(self.view.bounds), tableView.center.y);
    self.view.addSubview(popupView)
    popupView.clipsToBounds = true

    let opaqueView = UIView()
    let screenSize: CGRect = UIScreen.mainScreen().bounds
    opaqueView.frame.size = CGSize(width: screenSize.width, height: screenSize.height)
    opaqueView.alpha = 0.6
    UIApplication.sharedApplication().keyWindow!.insertSubview(opaqueView, belowSubview: popupView) 

使用这种方法会导致 opaqueView 被放置在包括 popupView 在内的所有内容上。相反,我希望将 popupView 放在 opaqueView 之上,但将 opaqueView 放在其他一切之上 (view, TabBar, NavBar)

【问题讨论】:

为什么将popupView 添加到self.view 而将opaqueView 添加到keyWindow 因为,如果我不将opaqueView 添加到keyWindowopaqueView 不会超过 TabBar 和 NavigationBar。 为什么不将 popupView 也添加到 keyWindow 中? 这就是答案。非常感谢! 【参考方案1】:

parent.insertSubview(child, belowSubview: sibling) 仅在siblingparent 的直接子代时有效,因此childsibling 共享同一个父代。当前代码不起作用,因为opaqueView(孩子)和popupView(兄弟)有不同的父母。

这意味着①popupView 应该使用keyWindow 作为父级,或者②opaqueView 应该使用self.view 作为父级。既然你想让opaqueView 凌驾于一切之上,那么选项①是唯一的解决方案。

【讨论】:

以上是关于将子视图置于一切之上,但低于另一个 UIView的主要内容,如果未能解决你的问题,请参考以下文章

无法让 UILabel 显示在 UIView 之上

如何将子视图从其父视图的父视图置于顶部

在 Swift 中选择时如何将子视图置于前面?

将一个窗口置于另一个窗口之上

从另一个方法将子视图添加到子视图

在视图控制器内的 UIView 之间滑动