通常,当您想到父视图-子视图的关系时,人们会倾向于期望子视图的原点将包含在父视图中(通常是父视图的原点)。然而,在UIKit
iOS 上,情况似乎并非如此。为什么子视图的原点 (0,0) 的UIWindow
?
为了演示,下面的代码生成了两个 UIView,一个是另一个的子视图。由于某种原因,innerView
原点似乎是整个UIWindow
. 我希望原点innerView
是原点outerView
(其原点由其超级视图的中心点决定)。
我得到什么:
self.edgesForExtendedLayout = []
let superView = self.view!
superView.backgroundColor = .white
let outerView = UIView()
outerView.backgroundColor = .cyan
superView.addSubview(outerView)
outerView.snp.makeConstraints { make in
make.width.equalToSuperview().inset(20)
make.height.equalTo(superView.snp.height).dividedBy(3)
make.center.equalToSuperview()
}
let innerView = UIView()
innerView.backgroundColor = .purple
outerView.addSubview(innerView)
innerView.snp.makeConstraints { (make) in
make.height.width.equalToSuperview().dividedBy(2)
}
我想要的是:
添加额外的SnapKit
约束线将innerView
原点设置为原点,outerView
但我发现这一步是无关紧要的。
self.edgesForExtendedLayout = []
let superView = self.view!
superView.backgroundColor = .white
let outerView = UIView()
outerView.backgroundColor = .cyan
superView.addSubview(outerView)
outerView.snp.makeConstraints { make in
make.width.equalToSuperview().inset(20)
make.height.equalTo(superView.snp.height).dividedBy(3)
make.center.equalToSuperview()
}
let innerView = UIView()
innerView.backgroundColor = .purple
outerView.addSubview(innerView)
innerView.snp.makeConstraints { (make) in
make.top.left.equalToSuperview() // Set origins equal
make.height.width.equalToSuperview().dividedBy(2)
}
这可能是对 iOS 中视图层次结构的根本误解,因为我一直依赖 Storyboards。这是我第一次涉足 iOS 上的程序化 UI,所以我仍在思考所有的细微差别。现在,证据使我相信每个视图——无论它存在于视图层次结构中的哪个位置——都从 key 的位置 (0,0) 开始UIWindow
。