【问题标题】:Adding subview at position with auto layout使用自动布局在位置添加子视图
【发布时间】:2014-02-25 23:21:17
【问题描述】:

我有一个具有多个子视图的 uiscrollview。它们一个接一个地堆叠在一起,有间距限制。它们通过自动布局定义 uiscrollview 的内容大小。

每个视图都是我的“sn-p 视图”——一个 100 像素的视图。当用户点击 sn-p 视图时,我需要用我的“消息视图”替换它 - 一个更高的视图。消息视图具有固有的内容大小。

当我替换它时,我删除了所有约束,然后再次应用它们,以便它们将所有视图堆叠在一起,并以正确的顺序插入新添加的消息视图。

这实际上工作正常,但并不顺利。我想对此进行动画处理,以便删除 sn-p,将下面的视图向下移动以为更高的消息视图腾出空间,新的消息视图添加了前一个 sn-p 的原点,我对其进行了动画处理填充空间的框架高度。

我的代码可以在没有自动布局的情况下执行此操作,并且效果很好。但是它有大量的布局代码,我希望用自动布局来做。

我尝试执行删除/重新应用约束过程,然后将 layoutIfNeeded 放入动画块中。问题是新添加的消息视图被添加了一个原点 0,0,然后动画到它的正确位置,这不是一个好的效果。

【问题讨论】:

    标签: ios ios7 uiscrollview autolayout


    【解决方案1】:

    您需要执行初始布局传递以首先将新视图放置到位。

    将其添加为子视图,并通过约束为其提供正确的位置(为此,您可以将其固定到传出视图的顶部)。调用 layoutIfNeeded,then 删除并更新所有约束并像现在一样执行动画布局。

    或者,在进行动画布局之前,手动将传入视图的框架设置为与传出视图相同。然后布局通道将从此而不是 CGRectZero 进行动画处理。这可能是一个更整洁的解决方案。

    【讨论】:

    • 我将它放在正确的位置,但我看到添加消息视图是即时的,然后其他视图的调整正在动画中。同样,在另一个方向上,消息视图被立即删除和替换,并且更明显,因为 sn-p 视图更短,立即添加,并且空间差异关闭是动画。
    • 您可能还想为视图的 alpha 设置动画,这取决于您所追求的效果。
    【解决方案2】:

    通常您会添加新的约束,然后为这些约束的应用设置动画,例如:

    [UIView animateWithDuration:0.4 animations:^{
        [self.view layoutIfNeeded];
    }];
    

    随着新约束的应用,这将产生更平滑的过渡。

    如果您想避免新的子视图从 0,0 开始并向下跳,您可以创建一个容器视图(对所有其他视图都有约束),然后将新视图添加到该容器中。因此,旧的“sn-p 视图”将在该容器中,您将从该容器中删除它,将新的视图放入该容器中,然后在所有新约束到位后为 layoutIfNeeded 设置动画。那应该避免您描述的效果。 (它还应该简化代码,因为您只会对指示容器视图和您添加到其中的子视图之间关系的约束感到困惑,而其他一切都应该由此驱动。)

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多