ios - 如何在自动布局中强制更新约束

标签 ios swift autolayout nslayoutconstraint

我使用自动布局将 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/

相关文章:

iOS 自动布局约束问题 |应用崩溃

ios - Swift - dispatch_after 的替代品

compiler-errors - 对被覆盖属性给出的错误使用不明确

ios - 使用容器 ViewController,如何在 subview Controller 之间添加交互式动画?

ios - 将 View 顶部对齐到垂直堆栈 View 中另一个 View 的底部

ios - 使用自动布局调整按钮大小

ios - 在 Swift 中一致地 append 值

iphone - 如何上传图片,然后在 iOS 中根据该图片执行自定义谷歌图片搜索?

ios - 如何在 Core Data 中使用带有 fetchRequest 的谓词

iphone - 在 XCode 中发送 HTTPS 请求 (iOS)