自动布局和可调整大小视图的问题

Posted

技术标签:

【中文标题】自动布局和可调整大小视图的问题【英文标题】:Problems with autolayout and resizable views 【发布时间】:2014-12-01 15:13:51 【问题描述】:

我对自动布局有疑问。

我有三个不同的视图(也可以是 n 个视图)。当我将第一个固定到超级视图的顶部并将一个连接到另一个时,一切似乎都很好。但是如果我想改变第一个的高度,其他两个不会跟随(它们保持在同一个位置)。我对此感到奇怪的是,如果我只连接两个视图,则效果很好。

为了更好地理解我想要实现的目标,我使用三个视图制作了简单的示例解决方案:

http://i.stack.imgur.com/cMwiB.png

所以,当我将绿色视图的高度设置为 0(也可以是任何其他数字)并且只连接红色视图时,这工作正常,红色会按应有的方式移动。蓝色的没有连接,它保持在原来的位置:

这是我将蓝色连接到红色时的屏幕截图:

我想做什么:

也将蓝色连接到绿色(不起作用) 仅将蓝色连接到绿色(不起作用) “装箱”:当时有带视图的盒子(丑陋,难以管理,并非在所有情况下都有效)

我想知道的:

是什么导致了这种情况发生?我可以改变这种行为吗? 具有灵活长度的最佳做法是什么(除了 UITableView)

提前致谢。

【问题讨论】:

这里缺少链接(没有足够的声誉:()i.stack.imgur.com/nq4EX.pngi.stack.imgur.com/vh1fX.png 这确实是一种奇怪的行为。您能否将设置约束的代码(或 Interface Builder 屏幕截图)粘贴到您设置约束的位置? 这里是 xml 中的故事板:pastebin.com/LFa27mrv 有一些未解决的自动布局冲突不会影响这一点(我刚刚创建了问题中提到的这些连接)。这是一个没有代码的普通应用程序。只有一个故事板文件。谢谢 测试时如何将绿色视图的高度设置为 0? 嗯,我可以通过代码或者storyboard来设置,没关系... 【参考方案1】:

好吧,我想你落入了我前段时间研究自动布局时遇到的同样的陷阱。解释起来很棘手,但我会尽力而为。当您使用自动布局时,您需要完全忘记设置视图的框架。我的朋友,这包括改变尺寸和定位。当你使用自动布局时,你定义了一些约束,一些“规则”,视图在渲染屏幕时试图遵守,所以规则越具体,视图的行为就越随机。我的意思是,如果您只定义视图之间的间距,则意味着视图的高度无关紧要,因此在调用重新布局时某些视图可能会增长或缩小(也就是说,如果您不'不指定大小约束。您可能希望始终在每个布局中指定某些视图的大小...)

顺便说一句,在调用重新布局之后,您可以通过手动更改元素的框架来违反约束,但是当再次调用重新布局方法时,约束将被强制,因此大小视图的位置也会发生变化。快速提示:强制重新布局方法的一种简单方法是改变方向(模拟器中的命令+左/命令+右)。

所以说完之后,我不得不说您提供的布局完全按预期工作,至少对我来说是这样。当您更改方向时,您指定的约束始终受到尊重。如果你愿意,你可以尝试在 viewDidAppear 方法中应用一些框架设置,因为这个设置在自动布局之后被调用(因此,你可以暂时违反约束)。完成此操作后,您的视图将被破坏,但一旦您更改方向,则应再次尊重约束。确保是这样。

从这里我只能祝你好运;)哦,参考文档,当我半年前看到这个时,它对我来说是一个救命稻草。 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Introduction/Introduction.html 可能看起来很经典,但它是一个非常好的文档。

编辑:最后一件事。我的印象是约束并非设计为动态的。你定义它们一次,它们就一直存在。它们的主要目的是确保子视图在每个屏幕分辨率下都按预期呈现,所以如果我要制作一个带有移动视图的应用程序,我会将它们留在自动布局之外,或者完全避免使用它。不过只是个人印象:)

【讨论】:

首先,非常感谢您的详细解释:) 我度过了一个漫长的夜晚,并找到了一种方法来实现我想要实现的目标。我会把它写在这里,所以如果有人遇到同样的问题,他/她可以找到答案:) 你说的一切都是正确的,如果你写下所有的常数并计算东西,一切都会按预期工作。所以不太可能在情节提要上进行动态更改。您可以做的是通过 IBOutlet 连接特定约束,然后将其更改为特定逻辑。就我而言,您必须定义所有的高度和间距,然后在代码后面更改 高度限制。经过一些实验,这乍一看是可以的,但我不确定以后这种行为,或者当你有复杂的逻辑时(可能很难维护)。如果我找到更好的方法,我也会在这里发布:) 是的,做起来总是很复杂,但真的很值得。另请注意,约束允许您指定大于或等于和小于或等于运算符,在您无法计算确切大小的情况下,您始终可以使用它们来确保最小值/最大值。最重要的是始终确保约束不会相互矛盾。如果您将它们指定为代码,它会返回一个巨大的错误,但我不知道界面生成器:(

以上是关于自动布局和可调整大小视图的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何创建类似于 instagram 布局应用程序的手势驱动的动态可调整大小视图

摆动面板可调整大小的间隙

带有可调整大小的列的 Tailwind 两列布局

如何在 Pyqt 中创建可调整大小的布局 UI?

有哪些选项可以使用带有可调整大小和可排序元素的 flexbox 进行类似砌体的布局

css 使用flexbox的响应式,可调整大小的面板布局