gpt4 book ai didi

ios - 什么是 _UITemporaryLayoutWidth 以及为什么它会打破我的限制?

转载 作者:IT王子 更新时间:2023-10-29 07:40:28 25 4
gpt4 key购买 nike

我有一个包含自动布局和大小类的 Storyboard。相当复杂的布局,不幸的是我无法确定如何在新项目中重现该问题。
但是有问题的 View 被固定在屏幕的左右边缘,具有 750 优先级的约束(即 |-(0@750)-[myView]-(0@750)-| ,此外它具有大于或等于优先级为 1000 的约束(即 |-(>=0)-[myView]-(>=0)-| )。这样做是为了限制 iPad 的宽度,所以有一个宽度约束 width <= 600 @1000 ,还有一个 center horizo​​ntal in container 约束。最重要的是该 View 的纵横比约束为 3:1。正如我所说,相当复杂。

Interface Builder 没有显示任何约束问题。 Xcode 布局预览可正确呈现所有设备。

当我运行应用程序时,iOS 告诉我它有冲突的约束。

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fd72853ff80 DMXKit.DipSwitchAssembly:0x7fd72990d0e0.width == 3*DMXKit.DipSwitchAssembly:0x7fd72990d0e0.height>",
"<NSLayoutConstraint:0x7fd728574e50 '_UITemporaryLayoutWidth' H:[DMXKit.DipSwitchAssembly:0x7fd72990d0e0(400)]>",
"<NSLayoutConstraint:0x7fd72856e9c0 V:[DMXKit.DipSwitchAssembly:0x7fd72990d0e0(133)]>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7ffb19798000 DMXKit.DipSwitchAssembly:0x7ffb1979a000.width == 3*DMXKit.DipSwitchAssembly:0x7ffb1979a000.height>

这会重复几次,具有完全相同(即相同的指针)约束。这也很奇怪,看起来约束并没有真正被打破。运行时,应用程序看起来 100% 正确。当我在 Xcode View 调试器中查看应用程序时,地址为 0x7ffb19798000 的约束仍然在那里,所以它从未被打破。

_UITemporaryLayoutWidth 在哪里?约束从何而来?显然我没有添加它。谷歌没有吐出任何关于 _UITemporaryLayoutWidth 的有用信息.有人遇到过这样的问题吗?

最佳答案

所以,我不确定这是否能帮助您解决问题,因为听起来您正在 IB 中构建布局,但这是我刚刚遇到的一个问题,可能有助于其他人在 google 上搜索“_UITemporaryLayoutWidth” .

我的场景是我在初始化期间添加了自动布局约束,并且在将 View 添加到 View 层次结构之前意外触发了“layoutIfNeeded”(修改按钮边缘插入触发布局)。看起来系统添加了这些临时约束并(我假设?)在将 View 添加到层​​次结构后删除它们。临时约束设置 0 维(在我的例子中),如果你在你的布局中设置特定的约束常量值(例如,你想在这些按钮之间有 16px 但那个维度中有 0 个空间......)可能会失败。 p>

更新: 稍微调查了一下,发现临时约束似乎对应于您用来初始化父 View 的框架。在我的例子中,我使用的框架大小为 0x0,因此相对于 0x0 大小评估的临时约束因此失败。验证如果我使用 5x5 帧进行初始化,那么我会看到与 _UITemporaryLayoutWidth(5) 约束相同的错误。我注意到的另一件事是,在布局评估期间似乎添加和删除了约束 - 如果我在触发布局之前中断并分析约束,那么我看不到临时约束。我也没有看到错误后的约束,所以我怀疑他们综合了临时约束,添加它们,解决然后删除它们。

更新 2: 好的,也许这是 TMI,但这可能对某些人有用。我目前的想法是,这些临时约束是对系统如何处理单个 View 层次结构中的混合帧操作和自动布局的窥视。在我的例子中,我的 View 没有父 View ,也没有定义其大小的约束,但它确实有一个零帧,这意味着系统假定这是它在解决布局时应该使用的大小。我的想法是,系统会为 View 综合这些临时约束,这些 View 的框架已明确设置,以在遍历层次结构时解决系统的其余部分。

更新 3: 所以,我又遇到了这个问题,想分享更多信息。我的场景是,我试图使用 systemLayoutSizeFittingSize: 方法从本质上测量没有父级的 View 。 长话短说,我不得不在测量 View 之前调用 layoutIfNeeded - 这是我遇到与临时约束冲突的地方,因为 View 没有父 View 。临时约束常量 (尺寸)确实对应于没有 super View 的 View 上设置的任何框架 - 我认为这是有道理的(虽然,在你将要与 AutoLayout 一起使用的 View 上设置框架似乎很奇怪......)我能够通过说 - 如果 View 没有 super View 然后将其添加到临时 super View 来解决临时约束问题;措施;从临时 super View 中删除它。希望这有用。

关于ios - 什么是 _UITemporaryLayoutWidth 以及为什么它会打破我的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30969353/

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