gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:11:01 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com