在 iOS 中,将视图添加为子视图与将视图分配给视图 属性 之间有区别吗?
In iOS, is there a difference between adding a view as a subview versus assigning a view to the view property?
我试图弄清楚 iOS 编程中的任何歧义,所以我看过一些教程,其中开发人员将他们的主视图分配给 viewController 的视图 属性,例如所以:
let sceneView = ARSCNView(frame: self.view.frame)
view = sceneView
但是我也看到开发人员将他们的主视图作为子视图添加到视图 属性 中,如下所示:
let sceneView = ARSCNView(frame: self.view.frame)
view.addSubView(sceneView)
这两个过程是相同的还是不同的?
它们并不相同,但在功能上是相似的。这是差异的演示:
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)
}
在调试器中:
与替换比较:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blue
let sceneView = UIView(frame: self.view.frame)
sceneView.backgroundColor = UIColor.red
self.view = sceneView
}
在调试器中:
所以你看到虽然它被子视图隐藏了,但当sceneView作为子视图添加时,原始蓝色视图仍然在视图层次结构中。但是,当您替换视图时,原始的蓝色视图根本不再是视图层次结构的一部分。
注意:如果您想在 loadView() 中设置视图,而不是像 rmaddy 所建议的那样在 viewDidLoad() 中进行替换,则类似的方法可行。诀窍是获得正确的框架——例如,如果您在导航控制器中,框架将不同。
override func loadView() {
let sceneView = UIView(frame: UIScreen.main.bounds)
sceneView.backgroundColor = UIColor.red
self.view = sceneView
}
我试图弄清楚 iOS 编程中的任何歧义,所以我看过一些教程,其中开发人员将他们的主视图分配给 viewController 的视图 属性,例如所以:
let sceneView = ARSCNView(frame: self.view.frame)
view = sceneView
但是我也看到开发人员将他们的主视图作为子视图添加到视图 属性 中,如下所示:
let sceneView = ARSCNView(frame: self.view.frame)
view.addSubView(sceneView)
这两个过程是相同的还是不同的?
它们并不相同,但在功能上是相似的。这是差异的演示:
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)
}
在调试器中:
与替换比较:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blue
let sceneView = UIView(frame: self.view.frame)
sceneView.backgroundColor = UIColor.red
self.view = sceneView
}
在调试器中:
所以你看到虽然它被子视图隐藏了,但当sceneView作为子视图添加时,原始蓝色视图仍然在视图层次结构中。但是,当您替换视图时,原始的蓝色视图根本不再是视图层次结构的一部分。
注意:如果您想在 loadView() 中设置视图,而不是像 rmaddy 所建议的那样在 viewDidLoad() 中进行替换,则类似的方法可行。诀窍是获得正确的框架——例如,如果您在导航控制器中,框架将不同。
override func loadView() {
let sceneView = UIView(frame: UIScreen.main.bounds)
sceneView.backgroundColor = UIColor.red
self.view = sceneView
}