在iOS中,将视图添加为子视图与将视图分配给视图属性之间是否存在差异?

时间:2017-11-29 18:47:57

标签: ios uiview uiviewcontroller addsubview

我试图理解iOS编程中的任何歧义,所以我看过开发人员将其主视图分配给viewController的view属性的教程,如下所示:

let sceneView = ARSCNView(frame: self.view.frame)
view = sceneView

但是我也看到开发人员将他们的主视图作为子视图添加到view属性中,如下所示:

let sceneView = ARSCNView(frame: self.view.frame)
view.addSubView(sceneView)

这两个过程是相同还是不同?

1 个答案:

答案 0 :(得分:6)

它们不完全相同,但在功能上它们是相似的。以下是差异的演示:

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.blue
    let sceneView = UIView(frame: self.view.frame)
    sceneView.backgroundColor = UIColor.red
    self.view.addSubview(sceneView)
}

在调试器中:

subview

与替换相比:

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.blue
    let sceneView = UIView(frame: self.view.frame)
    sceneView.backgroundColor = UIColor.red
    self.view = sceneView
}

在调试器中:

subview

所以你看到虽然它被子视图隐藏了,但当sceneView作为子视图添加时,原始的蓝色视图仍然在视图层次结构中。当您替换视图时,原始蓝色视图根本不再是视图层次结构的一部分。

注意:如果你想在loadView()中设置视图而不是在viewDidLoad()中替换,因为rmaddy建议像这样的东西可以工作。诀窍是获得正确的框架 - 如果你在导航控制器中,例如框架将是不同的。

override func loadView() {
    let sceneView = UIView(frame: UIScreen.main.bounds)
    sceneView.backgroundColor = UIColor.red
    self.view = sceneView
}