如何更改 UIView 的 z 索引或堆栈顺序?

Posted

技术标签:

【中文标题】如何更改 UIView 的 z 索引或堆栈顺序?【英文标题】:How do I change the z index or stack order of UIView? 【发布时间】:2015-05-12 23:13:29 【问题描述】:

我在现有控制器的顶部堆叠了一个 UIView,以创建一个渐变层。但是,当我加载视图时,新的 UIView (自然)位于一切之上。

相关代码:

class ViewController: UIViewController 

    @IBOutlet weak var myGradientView: GradientView!

    override func viewDidLoad() 
        super.viewDidLoad()            
    

    override func viewDidLayoutSubviews() 
        self.myGradientView.gradientWithColors(UIColor.whiteColor(), UIColor.blueColor())
    

我进行了一些搜索,发现 an answer in Objective-C 解释了如何使用:

[parentView 带来SubviewToFront:view];

我不知道 Objective-c,而且对 Swift 还很陌生,如果有人能对此有所了解,我将不胜感激。

我的问题:

如何在 Swift 中更改 UIView 的 z 索引或堆栈顺序?

【问题讨论】:

这是两种不同的语言@Ben 别担心,我需要学习如何阅读Objective-C 【参考方案1】:

我建议查看UIViewdocumentation,其中列出了用于操作子视图顺序的几种方法:

bringSubviewToFront(_:)
sendSubviewToBack(_:)
removeFromSuperview()
insertSubview(_:atIndex:)
insertSubview(_:aboveSubview:)
insertSubview(_:belowSubview:)
exchangeSubviewAtIndex(_:withSubviewAtIndex:)

根据你的情况,你可以试试:

self.view.sendSubviewToBack(myGradientView)
// self is your view controller in this case.

另外,因为您在 IB 中创建了 myGradientView,您可以更改视图层次结构以更改显示在顶部的视图。这是一张图片来说明:

希望对您有所帮助。

【讨论】:

哇...这个更新让我很吃力。我不敢相信我没有弄清楚 如果你有 5 个子视图并且你想将第二个移到最后一个怎么办?【参考方案2】:

以上回答

bringSubviewToFront(_:) sendSubviewToBack(_:)

已经改变:

在 Swift 3.0 中

view.sendSubview(toBack:yourUIView)
view.bringSubview(toFront:yourUIView)

在 Swift 4.0 && Swift 5.0 中

view.sendSubviewToBack(yourUIView)
view.bringSubviewToFront(yourUIView)

【讨论】:

添加一些解释,说明此答案如何帮助 OP 解决当前问题

以上是关于如何更改 UIView 的 z 索引或堆栈顺序?的主要内容,如果未能解决你的问题,请参考以下文章

颤振布局问题:堆栈 z 顺序不起作用

如何更改 XCode xib 中的堆叠顺序或对象? [复制]

更改手势识别器的索引

如何在 WPF 中为装饰器设置 Z 顺序索引

如何通过拖动在SwiftUI ZStack中重新排列视图

z 顺序更改时的 Winform 控件事件