在具有自动布局的 UIView 之间切换

Posted

技术标签:

【中文标题】在具有自动布局的 UIView 之间切换【英文标题】:toggling between UIViews that have autolayout 【发布时间】:2014-12-10 10:46:23 【问题描述】:

我有一个带有 2 组按钮的屏幕(两组都在 UIView 内),只需要显示一个,在它们下方有一个 UICollectionView(并在自动布局中与其中一个绑定)

为了“显示”我正在使用的正确视图[self.view bringSubviewToFront:<relevant view>];

在我前进到另一个屏幕并按返回之前,一切正常。 我在按钮视图和 UICollectionView 之间出现了一个奇怪的空白

这肯定是在“2次替换”之后发生的(2次调用bringSubviewToFront

所以我的问题是 - 将 2 个视图放在同一个位置并在使用自动布局时选择正确的视图的正确方法是什么

【问题讨论】:

【参考方案1】:

创建容器UIView,将其约束到UICollectionView,并将相关按钮视图添加为容器视图的子视图。这样,您需要管理的唯一约束是切换时容器与其子视图之间的约束。集合视图和容器视图始终存在,因此只需初始设置一次。

当你在容器中切换视图时,你需要在代码中添加约束,像这样

// Remove the view that is no longer relevant, this will remove associated constraints 
[viewToRemove removeFromSuperview]; 

// Add the relevant view to the container
[containerView addSubview:viewToAdd];

// This constrains the view to all edges of the container
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[viewToAdd]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewToAdd)];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[viewToAdd]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewToAdd)];

确保保持对两个视图的强引用,这样它们就不会在从视图堆栈中删除后被释放。

如果您想要更快的方法,我只需设置相关视图hidden 属性,而不是更改子视图堆栈的顺序。不过我推荐第一种方式,这样你就可以确保用户不能点击不应该显示给他们的按钮

【讨论】:

以上是关于在具有自动布局的 UIView 之间切换的主要内容,如果未能解决你的问题,请参考以下文章

iOS自动布局两个UIView具有相等的宽度

UIView 无法在具有自动布局的 UIScrollView 中正确居中

“隐藏”具有自动布局子视图的 UIView

如何使自动布局与 XIB 中的自定义 UIView 一起使用?

将子类 UIView 添加到具有自动布局约束的 Nib

显示具有程序化自动布局的视图