启用自动布局的 iOS 调整视图大小

Posted

技术标签:

【中文标题】启用自动布局的 iOS 调整视图大小【英文标题】:iOS resize view with auto layout enabled 【发布时间】:2012-10-29 15:04:06 【问题描述】:

给定的问题

我有以下视图,其中包括导航栏、搜索栏和表格视图 - 左图是我拥有的给定视图,右图是我想要实现的 - 基本上只是隐藏导航栏并调整所有内容的大小。

目前的解决方案

目前我已经设法使用从搜索框到超级视图顶部属性的垂直空间约束来隐藏和调整所有内容 -

默认约束常量为44(导航栏高度) 点击搜索框后我隐藏导航栏并将约束常量设置为0 当我停止搜索时,我会恢复导航栏并将约束再次设置为 44

我想要什么

我正在寻找最简单的方法来隐藏导航栏并调整搜索框 + 表格的大小以填满整个屏幕。

有没有任何方法可以做到这一点并利用 ios 6 自动布局系统?

我目前的解决方案感觉不自然。

【问题讨论】:

【参考方案1】:

如果这是您需要更改的唯一约束,那么您可以在视图或视图控制器中为该约束创建一个 IBOutlet,然后根据需要更改的时间简单地修改约束:

if(shouldHide)
  self.nibTitleBarConstraint.constant = 0.f;

else
  self.nibTitleBarConstraint.constant = 44.f;

如果您想为更改设置动画,只需将 -layoutIfNeeded 粘贴到动画上下文中即可:

[UIView animateWithDuration:0.33f
                 animations:^
                   [view layoutIfNeeded];
                 ];

这适用于您想要修改的任何约束常量(高度、顶部空间等),只要您的其他约束知道如何对该视图约束的更改做出反应。

【讨论】:

正如我在总结中所写的,这正是我现在正在做的事情:) 所以这似乎是目前最好的方法。 您从未提到约束的 IBOutlet,但是是的,这似乎是我能想到的最佳方式。修改常量比删除/添加约束和让自动布局再次解决约束集在算法上效率更高。【参考方案2】:

你能不能:

[[self navigationController] setNavigationBarHidden:YES animated:NO];

【讨论】:

我没有使用navigationController,只是将一个普通的导航栏放到视图中 你为什么使用导航栏? 作为标题栏,实际上并不重要——我可以在那里使用自定义视图,但仍然想要相同的行为。隐藏它并相应地调整其余视图的大小 你知道KISS原理吗?因为你说你想隐藏它,如果你想隐藏它的目的是什么?我不认为我是唯一一个对你想要实现的目标感到困惑的人。 我在摘要中可能不够清楚 - 我的问题更笼统,我想知道当另一个视图(受到他的约束)时调整视图大小的最佳方法是什么已删除,我会在稍后更新摘要。

以上是关于启用自动布局的 iOS 调整视图大小的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 自动布局和旋转

iOS:使用自动布局保持视图彼此按比例调整大小

iOS 8 自动布局 - 动态调整 4 个方形视图的大小

iOS 故事板 - 自动布局不会调整子视图的大小和位置

在启用自动布局的情况下调整 swift/xcode 中的按钮大小

使用自动布局进行编辑时在表格视图中调整子视图的大小