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

Ios 自动布局和可调整大小视图的问题,ios,objective-c,autolayout,Ios,Objective C,Autolayout,我对自动布局有意见 我有三种不同的观点(也可以是n种观点)。当我将第一个固定到super view顶部并将一个连接到另一个时,一切似乎都很好。但如果我想改变第一个的高度,其他两个就不会跟随(它们保持在相同的位置)。我觉得奇怪的是,如果我只连接了两个视图,这就完美了 为了更好地理解我试图实现的目标,我用三个视图制作了简单的示例解决方案: 所以,当我将绿色视图的高度设置为0(也可以是任何其他数字)并且只连接了红色视图时,效果很好,红色将按它应该的方式移动。蓝色的一个未连接,它仍保持在原来的位置:

我对自动布局有意见

我有三种不同的观点(也可以是n种观点)。当我将第一个固定到super view顶部并将一个连接到另一个时,一切似乎都很好。但如果我想改变第一个的高度,其他两个就不会跟随(它们保持在相同的位置)。我觉得奇怪的是,如果我只连接了两个视图,这就完美了

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

所以,当我将绿色视图的高度设置为0(也可以是任何其他数字)并且只连接了红色视图时,效果很好,红色将按它应该的方式移动。蓝色的一个未连接,它仍保持在原来的位置:

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

我想做的是:

  • 将蓝色连接到绿色(不工作)
  • 仅将蓝色连接到绿色(不工作)
  • “装箱”:当时有带视图的箱子(丑陋、难以管理、在所有情况下都不起作用)
我想知道的是:

  • 是什么让这一切发生的?我能改变这种行为吗
  • 除了UtableView外,为高度设置灵活长度的最佳实践是什么

提前谢谢。

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

顺便说一下,您可以在调用重新布局后手动更改图元的框架来违反约束,但当再次调用重新布局方法时,约束将被强制,因此视图的大小和位置将发生变化。快速提示:强制重新布局方法的一个简单方法是改变方向(模拟器中的command+left/command+right)

所以在说了这些之后,我不得不说,你提供的布局完全符合预期,至少对我来说是这样。更改方向时,始终会遵守指定的约束。如果需要,可以尝试在ViewDidDisplay方法中应用一些帧设置,因为此设置是在自动布局之后调用的(因此,可以暂时违反约束)。执行此操作后,视图将被破坏,但一旦更改方向,应再次遵守约束。确保是那样的

从这里我只能祝你好运;)哦,请参考文档,半年前我看到这个时,它对我来说是个救命稻草。这可能看起来很经典,但这是一个很好的医生


编辑:最后一件事。我的印象是,约束并非设计为动态的。你定义它们一次,它们总是在那里。它们的主要目的是确保子视图在每个屏幕分辨率下都能按预期呈现,因此,如果我要制作一个带有移动视图的应用程序,我会将它们放在autolayout之外,或者根本不使用它。不过这只是个人的印象:)

这里缺少链接(没有足够的声誉:()这确实是一种奇怪的行为。你能粘贴代码吗(如果是这样的话,请粘贴界面生成器屏幕截图)在哪里设置约束?这是xml中的故事板:有一些未解决的自动布局冲突不会影响这一点(我刚刚创建了问题中提到的这些连接)。这是一个简单的应用程序,没有代码隐藏。只有一个故事板文件。ThanksHow当您测试此功能时,是否将绿色视图的高度设置为0?好的,我可以通过代码或故事板进行设置,无所谓……首先,非常感谢您的详细解释:)我度过了一个漫长的夜晚,找到了一种方法来实现我正在尝试实现的目标。我会把它写在这里,这样如果有人在同一个问题上陷入困境,他/她可以找到答案:)你说的一切都是正确的,如果你写下所有常数并计算,一切都会按预期进行。所以不太可能在情节提要上进行动态更改。您可以做的是通过IBOutlet连接特定的约束,然后为特定的逻辑更改它。在我的例子中,您必须定义所有的层次和间距,然后在代码隐藏中更改高度约束。经过一些实验后,乍一看这是可以的,但我不确定以后会发生什么,或者当你有复杂的逻辑时(可能很难维持)。如果我找到更好的方法,我也会把它贴在这里:)是的,它总是精心制作的,但它确实值得付出努力。还请注意,这些约束允许您指定较大或相等以及较小或相等运算符,如果无法计算准确的大小,则始终可以使用这些运算符来确保最小值/最大值。最重要的是始终确保约束不会相互矛盾。如果将它们指定为代码,则会返回一个巨大的错误,但我不知道interface builder:(