[iOS]:删除和添加约束时自动布局动画更改框架位置

Posted

技术标签:

【中文标题】[iOS]:删除和添加约束时自动布局动画更改框架位置【英文标题】:[iOS]: Auto layout animate change of frame position when removing and adding constraints 【发布时间】:2014-05-01 15:06:36 【问题描述】:

我有一个复杂的自动布局,需要通过删除旧约束并添加新约束来适应旋转。

我在containerView 中有一个网格布局。

问题是当我打电话时

  [UIView animateWithDuration:0.4 animations:^
            [self.containerView layoutIfNeeded];
    ];

视图总是从位置 [0,0] 动画到它们的新位置。我更喜欢的是视图将从旧位置(在我删除约束之前)移动到新位置(在删除和添加新约束之后)

有人能够做到这一点吗?

【问题讨论】:

给动画块添加约束操作怎么样? 你是在viewDidLoad做这个吗?初始约束尚未应用,因此为 0,0。如果您在viewDidAppear 中执行此操作,您应该会看到它们从旧位置动画到新位置。如果这是一个基于旋转的动画,您尝试使用哪种方法调用它?此外,在删除旧约束后,您是否正在做任何可能触发(不存在的)约束被应用的事情(这可能发生在最无害的操作中,例如设置文本标签)?更多关于您将此代码放在何处的上下文可能会有所帮助。 【参考方案1】:

以下post 给了我使其工作的提示:

但不是实际接受的答案,而是:

[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionLayoutSubviews animations:^
    [self.view layoutIfNeeded];
 completion:nil];

可选参数options:UIViewAnimationOptionLayoutSubviews 启发我尝试不同的选项,而实际需要的选项是options:UIViewAnimationOptionBeginFromCurrentState

[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionBeginFromCurrentState animations:^
        [self layoutIfNeeded];
     completion:nil];

这允许动画从最后一个位置开始,即使移除约束并添加新约束。

【讨论】:

以上是关于[iOS]:删除和添加约束时自动布局动画更改框架位置的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 iOS 8 自动布局问题

使用自动布局删除和重新添加子视图

UICollectionView 上的动画自动布局约束更改

ios 6自动布局约束错误

动画自动布局`leftAnchor`约束更改

更改高度约束时的iOS自动布局问题