我使用自动布局将 subview 放置在 super View 中。我想要从 AutoLayout 引擎得到的 - 是计算 UIView
类型的 subview 的宽度,然后在同一遍中使用该值来更新该 subview 在其 super View 中的位置,以正确分配我的 subview 。
我使用 NSLayoutConstraint 类型约束来设置 AutoLayout。我的 subview 的宽度等于我的 View 的高度:
timer.heightAnchor.constraint(equalTo: (timer.widthAnchor)!, multiplier: 1).isActive = true
当我为 subview 应用一组约束时,自动布局会根据顶部和底部常量的填充来计算它们的宽度和高度。 所有的东西都工作得很好。当我尝试使用 subview 的宽度作为约束的常量时,我希望一次性计算出来:
timer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: (self.view.bounds.width - 2*timer.bounds.width)/3)
我在这里没有运气。我试图理解出了什么问题,最终得出的结论是,当我应用约束并激活它们时,自动布局尚未获得 subview 宽度的更新值。当我尝试:
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 使用约束常量中的更新值。
最佳答案
工作解决方案似乎很简单 - 在同一遍中,只需更新使用该宽度的约束的常量值:
MyTimer.constant = timer!.bounds.width
然后使用 AutoLayout 引擎使用更新的约束再次调用 self.view.layoutIfNeeded() 来计算 subview 的位置。从资源消耗的角度来看,这不是一个很好的解决方案。但对于我的这种具有均匀间距的布局的特殊情况来说,这是相当不错的。不明显的是,尽管在约束的常量中引用了变量,但我必须再次执行此操作。
关于ios - 如何在自动布局中强制更新约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46059836/