我有一个包含多个子视图的uiscrollview。它们在间隔约束下一个接一个地堆叠。它们通过自动布局定义uiscrollview的内容。
每个视图都是我的“摘录视图” - 一个100像素的视图。当用户点击片段视图时,我需要将其替换为我的“消息视图” - 一个更高的视图。消息视图具有内在内容大小。
当我替换它时,我删除了所有约束,然后再次应用它们,以便它们将所有视图堆叠在一起,并以正确的顺序插入新添加的消息视图。
这实际上工作正常,但不顺利。我想要动画这样,以便删除片段,下面的视图被放下来为更高的消息视图腾出空间,新的消息视图添加了前一个片段的原点,并设置其框架高度的动画以填充空间。
我有没有自动布局的代码,它运行良好。但它有大量的布局代码,我希望能用自动布局。
我尝试过删除/重新应用约束过程,然后将layoutIfNeeded放在动画块中。问题是新添加的消息视图添加了0,0的原点,然后动画到其正确的位置,这不是一个好的效果。
答案 0 :(得分:1)
您需要执行初始布局传递以首先将新视图放入位置。
将其添加为子视图,使用约束来为其提供正确的位置(为此,您可以将其固定在外向视图的顶部)。调用layoutIfNeeded,然后删除并更新所有约束并像现在一样执行动画布局。
或者,在执行动画布局之前,手动将传入视图的帧设置为与传出视图相同。然后布局传递将从此而不是CGRectZero动画。这可能是一个更简洁的解决方案。
答案 1 :(得分:0)
通常你会添加新的约束,然后为这些约束的应用设置动画,例如:
[UIView animateWithDuration:0.4 animations:^{
[self.view layoutIfNeeded];
}];
随着新约束的应用,这将产生更平滑的过渡。
如果要避免让新子视图从0,0开始并跳转,可以创建容器视图(对所有其他视图都有约束),并将新视图添加到该容器。因此,旧的“片段视图”将位于该容器中,您将从该容器中删除它,将新的容器放入该容器中,然后在所有新约束到位后为layoutIfNeeded
设置动画。这应该避免你描述的效果。 (它还应该简化代码,因为你只会使用约束来控制容器视图和你添加到它的子视图之间的关系,其他一切都应该从中驱动。)