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

6

所面临的问题

我有以下视图,包括导航栏、搜索栏和表视图——左边是当前的视图,右边是我想要实现的效果——基本上只需要隐藏导航栏并调整所有东西的大小。

given wanted

当前解决方案

目前,我使用从搜索框到superview顶部属性的垂直空间约束来隐藏和调整所有内容 -

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

vertical-constraint

我的期望

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

有没有任何方法可以利用iOS 6自动布局系统来实现它?

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

2个回答

6

如果您只需要更改这个约束条件,那么您可以为该约束条件创建一个IBOutlet并将其插入到您的视图或视图控制器中,然后根据需要修改约束条件:

if(shouldHide){
  self.nibTitleBarConstraint.constant = 0.f;
}
else{
  self.nibTitleBarConstraint.constant = 44.f;
}

如果您想要动画效果,只需将-layoutIfNeeded放置在动画上下文中即可:
[UIView animateWithDuration:0.33f
                 animations:^{
                   [view layoutIfNeeded];
                 }];

任何约束条件的常量都可以进行修改(高度、顶部间距等),只要您的其他约束条件知道如何应对该视图约束条件的更改即可。

正如我在摘要中所写的,这正是我现在正在做的 :) 因此,目前看来这似乎是最好的方法。 - Nimrod Gutman
你从未提到约束的 IBOutlet,但是我认为这似乎是最好的方法。修改常量比删除/添加约束并让自动布局再次解决约束集要更具算法效率。 - larsacus

1

你能不能只是:

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

我没有使用navigationController,只是将一个普通的导航栏放入了一个视图中。 - Nimrod Gutman
你使用导航栏是为了什么? - Tieme
作为标题栏,实际上并不重要 - 我可以在那里使用自定义视图,但仍然希望具有相同的行为。隐藏它并相应地调整其余视图的大小。 - Nimrod Gutman
你知道KISS原则吗?因为你说你想要隐藏它,如果你想要隐藏它,那么一开始放置它的目的是什么呢?我不认为我是唯一一个对你想要实现的东西感到困惑的人。 - Rui Peres
我在摘要中可能没有表述清楚 - 我的问题更为一般,我想知道当另一个视图(与其约束)被移除时,最好的方法是使视图重新调整大小,我会在稍后更新摘要。 - Nimrod Gutman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接