具有.zero框架的视图的位置

时间:2018-07-04 17:21:45

标签: ios swift

我有一个视图(视图A)。我需要获得它在其超级视图内部的位置(理想情况下,它是X中心和Y中心的CGPoint)。

这很容易,除了在将VIEW A添加到视图中时,将其框架设置为.zero,然后使用NSLayoutConstraint锚将其定位。因此,稍后,当我想要获取它的框架时(我也尝试过它的边界),它返回为(0,0,0,0)。

VIEW A是可见的,并且位于其超级视图中...因此它具有一些X / Y坐标以及宽度/高度,对吗?如何访问这些值?

2 个答案:

答案 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)