我使用AutoLayout将我的子视图放在superview中。我想从AutoLayout引擎得到的是计算UIView
类型子视图的宽度,然后在同一遍中使用此值在其超级视图中更新此子视图的位置,以便正确分发我的子视图。
我使用NSLayoutConstraint
类型约束来设置AutoLayout。我的子视图的宽度等于我视图的高度:
timer.heightAnchor.constraint(equalTo: (timer.widthAnchor)!, multiplier: 1).isActive = true
当我为子视图应用约束集时,AutoLayout根据顶部和底部常量的填充计算它们的宽度和高度。 所有的东西都运行正常。当我尝试使用子视图的宽度作为约束的常量时,我希望在一次传递中计算:
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。我在堆栈上找到了类似的问题并尝试使用
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
print("now timer's width is =", timer!.bounds.width)
是的,现在我在同一个传递中获得了计时器宽度,而不是“0”,但AutoLayout仍然没有使用它。 问题是 - 如何强制AutoLayout使用约束常量中的更新值。
答案 0 :(得分:0)
工作解决方案似乎很简单 - 在同一个传递中只更新使用该宽度的约束的常量值:
MyTimer.constant = timer!.bounds.width
并使用AutoLayout引擎使用更新的约束来再次调用self.view.layoutIfNeeded()来计算子视图的位置。从资源消耗的角度来看,这不是一个很好的解决方案。但对于这种具有均匀间距的布局的特殊情况,这是非常好的。不明显的是,尽管在约束中引用了常量变量,我必须再次这样做。