更改启用自动布局的控件的位置会还原更改吗?

Posted

技术标签:

【中文标题】更改启用自动布局的控件的位置会还原更改吗?【英文标题】:Changing the position of the autolayout enabled control revert the changes? 【发布时间】:2014-08-20 12:32:54 【问题描述】:

我的应用程序的一部分在 UIcollectionView 中显示一个列表,如果用户向下滑动屏幕,我将在 viewController 顶部显示带有动画的 UISearchBar。 我在一个单独的 viewController 中完成了所有这些操作。

我使用自动布局来定位该 viewController 中的控件。

当用户向下滑动屏幕时,我将搜索栏从 y=-88 移动到 y=0 并向下移动 collectionView 以便为带有动画的 searchBar 腾出空间,我的问题是,如果我调用 reloadData 到 collectionView,搜索栏和 CollectionView 都移动到它们之前的自动布局位置

我使用下面的动画来移动它们

[UIView animateWithDuration:0.4 animations:^(void)
        fileSearchBar.frame=fileSearchBar.frame=CGRectOffset(fileSearchBar.frame, 0,88);
        chartsCollectionView.frame=gridFrame;///gridFrame is calculated to move down
    ]; 

我有办法阻止它们移动到预先计算好的位置

【问题讨论】:

【参考方案1】:

当你使用自动布局时,你不能设置框架。您必须更改约束并让它间接更改框架。

Apple 的 Auto Layout Guide 显示 an example 的动画:

[containerView layoutIfNeeded]; // Ensures that all pending layout operations have been completed
[UIView animateWithDuration:0.4 animations:^
     // Make all constraint changes here
     [containerView layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes
];

您没有展示如何设置约束,因此我无法展示如何修改它们以移动搜索栏和集合视图。理想情况下,您只需要设置其中一个约束的 constant 属性。 (您的约束应该设置为移动一件事会导致另一件事自动调整。)

【讨论】:

以上是关于更改启用自动布局的控件的位置会还原更改吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局更改按钮位置

自动布局打开时如何以编程方式更改 UIView 的位置

使用自动布局和约束更改位置

在启用自动布局和大小类的情况下更改视图宽度

如何在启用自动布局的情况下更改 iOS6 中的 UIView 大小?

使用自动布局更改方向时更改内容顺序