我有一个视图(视图A)。我需要获得它在其超级视图内部的位置(理想情况下,它是X中心和Y中心的CGPoint)。
这很容易,除了在将VIEW A添加到视图中时,将其框架设置为.zero,然后使用NSLayoutConstraint锚将其定位。因此,稍后,当我想要获取它的框架时(我也尝试过它的边界),它返回为(0,0,0,0)。
VIEW A是可见的,并且位于其超级视图中...因此它具有一些X / Y坐标以及宽度/高度,对吗?如何访问这些值?
答案 0 :(得分:2)
调用super的实现后,在viewDidLayoutSubviews上可以安全地访问更新的框架
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Here we have access to updated frames
}
如果要添加子视图,例如在viewDidLoad中,则UIViewController不会对框架进行任何计算。它仅具有描述其视图之间关系的规则(约束)。在UIViewController的生命周期中,viewDidLayoutSubviews是框架计算已经完成的地方,可以安全地访问它们。您甚至可以在超级调用后自己计算一些帧。
答案 1 :(得分:1)
在父视图中调用setNeedsLayout()
AND layoutIfNeeded()
:
let myView = UIView(frame: .zero)
myView.backgroundColor = .red
myView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(myView)
myView.topAnchor.constraintEqualToSystemSpacingBelow(view.topAnchor, multiplier: 1).isActive = true
myView.leftAnchor.constraintEqualToSystemSpacingAfter(view.leftAnchor, multiplier: 1).isActive = true
myView.widthAnchor.constraint(equalToConstant: 50).isActive = true
myView.heightAnchor.constraint(equalToConstant: 50).isActive = true
view.setNeedsLayout()
view.layoutIfNeeded()
print(myView.frame)