如何在自动布局中强制约束更新
How to force a constraint to update in the Auto Layout
我使用 AutoLayout 将我的子视图放在父视图中。我想从 AutoLayout 引擎中得到的是计算 UIView
类型的子视图的宽度,然后在同一次传递中使用此值更新此子视图在其父视图中的位置,以正确分配我的子视图。
我使用 NSLayoutConstraint
s 类型约束来设置 AutoLayout。我的子视图的宽度等于我的视图的高度:
timer.heightAnchor.constraint(equalTo: (timer.widthAnchor)!, multiplier: 1).isActive = true
当我为子视图应用一组约束时,AutoLayout 会根据顶部和底部常量的填充计算它们的宽度和高度。
所有东西都有效 fine.When 我尝试使用子视图的宽度作为约束常量,我希望一次性计算出来:
timer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: (self.view.bounds.width - 2*timer.bounds.width)/3)
我在这里没有运气。我试图了解出了什么问题,并得出结论,在我应用约束并激活它们的那一刻,AutoLayout 没有得到子视图宽度的更新值。当我尝试这样做时,这变得很明显:
print("timer.bounds.width", timer.bounds.width)
得到 0.0。我在 Stack 上发现了类似的问题并尝试使用
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
print("now timer's width is =", timer!.bounds.width)
是的,现在我在同一遍中获得了计时器宽度,而不是“0”,但 AutoLayout 仍然没有使用它。
问题是 - 如何强制 AutoLayout 在约束常量中使用更新后的值。
可行的解决方案似乎很简单——在同一个过程中,只需更新使用该宽度的约束的常量值:
MyTimer.constant = timer!.bounds.width
然后使用 AutoLayout 引擎再次使用更新的约束调用 self.view.layoutIfNeeded() 来计算子视图的位置。从资源消耗的角度来看,这不是一个很好的解决方案。但是对于我的这种具有均匀间距的布局的特殊情况,它非常好。不明显的是,尽管在常量中引用了约束的变量,但我必须再做一次。
我使用 AutoLayout 将我的子视图放在父视图中。我想从 AutoLayout 引擎中得到的是计算 UIView
类型的子视图的宽度,然后在同一次传递中使用此值更新此子视图在其父视图中的位置,以正确分配我的子视图。
我使用 NSLayoutConstraint
s 类型约束来设置 AutoLayout。我的子视图的宽度等于我的视图的高度:
timer.heightAnchor.constraint(equalTo: (timer.widthAnchor)!, multiplier: 1).isActive = true
当我为子视图应用一组约束时,AutoLayout 会根据顶部和底部常量的填充计算它们的宽度和高度。 所有东西都有效 fine.When 我尝试使用子视图的宽度作为约束常量,我希望一次性计算出来:
timer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: (self.view.bounds.width - 2*timer.bounds.width)/3)
我在这里没有运气。我试图了解出了什么问题,并得出结论,在我应用约束并激活它们的那一刻,AutoLayout 没有得到子视图宽度的更新值。当我尝试这样做时,这变得很明显:
print("timer.bounds.width", timer.bounds.width)
得到 0.0。我在 Stack 上发现了类似的问题并尝试使用
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
print("now timer's width is =", timer!.bounds.width)
是的,现在我在同一遍中获得了计时器宽度,而不是“0”,但 AutoLayout 仍然没有使用它。 问题是 - 如何强制 AutoLayout 在约束常量中使用更新后的值。
可行的解决方案似乎很简单——在同一个过程中,只需更新使用该宽度的约束的常量值:
MyTimer.constant = timer!.bounds.width
然后使用 AutoLayout 引擎再次使用更新的约束调用 self.view.layoutIfNeeded() 来计算子视图的位置。从资源消耗的角度来看,这不是一个很好的解决方案。但是对于我的这种具有均匀间距的布局的特殊情况,它非常好。不明显的是,尽管在常量中引用了约束的变量,但我必须再做一次。