如何让自动布局在 Xcode 中工作

Posted

技术标签:

【中文标题】如何让自动布局在 Xcode 中工作【英文标题】:how to get auto layout to work in Xcode 【发布时间】:2013-07-31 20:36:50 【问题描述】:

我查看了http://developer.apple.com/library/ios/#recipes/xcode_help-interface_builder/articles/UnderstandingAutolayout.html,但解释很模糊。

我在 iOS 6 上。我有一个带有两个子视图的视图控制器,一个在另一个之上:

我想使用自动布局来设置视图,如果我以编程方式更改顶视图的框架,底视图将调整大小以适应顶视图的新框架。也就是说,如果我增加顶视图的高度,底视图的高度应该降低以保持两个视图之间的相同间隔;如果我降低顶视图的高度,则会发生相反的情况。

我在 Xcode 中为这两个视图获得的默认约束是:

如果我按住 Command 并调整顶部(地图)视图的大小,底部(表格视图)似乎会正确地垂直收缩或扩展以遵守它们之间的空间限制。

但是,当我尝试通过代码修改顶视图的框架或边界时,例如:

self.topView.frame = CGRectMake(0, 0, 320, 514);

底视图不会缩小。 那我错过了什么?

【问题讨论】:

【参考方案1】:

你不能这样修改self.topView.frame。设置框架是自动布局的工作。您需要修改约束,然后让自动布局更新框架。

在您的视图控制器中创建NSLayoutConstraint 类型的插座:

@property (nonatomic, strong) IBOutlet NSLayoutConstraint *topViewHeightConstraint;

将插座连接到故事板顶视图上的 height=127 约束。 See this answer 如果您需要更多帮助将插座连接到约束。

然后,要改变顶视图的高度,并让自动布局也更新底视图的框架,设置约束的常量:

self.topViewHeightConstraint.constant = 514;

在运行循环结束时(不是立即,而是在屏幕更新之前),自动布局将修改两个视图的框架以满足更改后的约束。

【讨论】:

哦,好的,我明白了。我认为他们的工作方式相反:框架的变化触发了约束的变化。谢谢!最后一件事,如果您愿意,我可以创建一个单独的问题,但是,我尝试将 NSLayoutConstraint.constant 值更改包装在 UIView animateWithDuration:... 调用中,希望能够为调整大小设置动画,但它没有动画。我现在正要直接尝试 CoreAnimation,但想知道您是否知道它是否可能? 您需要强制 UIKit 在动画块内执行布局传递。您可以在块内执行[self.topView layoutIfNeeded],或者如果您使用带有选项的完整动画方法,您可以传递UIViewAnimationOptionLayoutSubviews 标志。

以上是关于如何让自动布局在 Xcode 中工作的主要内容,如果未能解决你的问题,请参考以下文章

项目从Xcode 8转换为Xcode 9时自动布局失败

高度的自动布局在 iOS 8 中工作但在 iOS 7 中不工作

UITableView 自动布局定位

具有自动布局的 UITableView 中的动态单元格高度

如何在 xcode 自动布局中使对象自动调整大小?

无法让 Angular 控制器在 MVC 布局中工作