在代码中修改故事板自动布局约束的最佳做法?

我一直在代码中完成我的用户界面,但已经决定我应该为当前项目使用故事板和自动布局。 一切都进展顺利,直到我build立了一个复杂的场景,有大约50个观点,有很多层次和一些观点。

问题是,我的汽车布局越来越混乱的一些设备和方向。 我发现使用IB来尝试修复几十(几百?)个约束或追踪问题并解决这些问题是具有挑战性的。 情况是这样的,我没有得到错误或警告,有时只是一些不愉快的布局。 而IB可能会带来一些痛苦,所有的点击和改变设置都需要你去追踪约束信息,更不用说全面了解它们在场景中的相关性。

我刚刚花了一天时间阅读关于自动布局和约束的文档和背景材料,似乎我的最佳解决scheme是使用可视化格式来指定代码中的约束,并创build一些自定义代码来提供帮助。 但是,我似乎无法find关于如何从IB转换到代码的任何事情。

具体而言,我是否应该清除所有IB的限制,并全部手工完成,还是可以select? 我问,因为我有一些视图组包含视图的内容视图有一个完美的布局。

其次,我最好把我的代码? 我想共存故事板,只是想有select地修改一些复杂的场景。 是一个视图控制器的viewWillAppear:修改或删除/添加它所控制的视图的约束的正确位置?

将您想要在storyboard / xib文件中修改的NSLayoutConstraint的IBOutlet连接到您的控制器/视图类。

一旦连接了布局对象,就可以修改.constant属性并为视图添加animation:

[self.containerView layoutIfNeeded]; //make sure all layout operations are done self.containerViewBottomLayoutConstraint.constant = 200.0; //change the layout [UIView animateWithDuration:duration animations:^{ [self.containerView layoutIfNeeded]; //animate the changes }]; 

更新:你可以添加你的修改代码在viewDidLoad,awakeFromNib,viewDidAppear,或基于事件。 这真的取决于你的意图。

对不起,等了很久才回到这个,而其他项目入侵。

为了简化我的场景,我不得不做很多重构,以便自动布局能够做正确的事情,但是我对结果并不完全满意。 问题似乎是,IB很难用于很多项目,而且自动布局是非常复杂的。

据说,迄今为止我见过的最好的结果是从Justin Driscoll的这篇文章中得出的: http : //themainthread.com/blog/2014/02/building-a-universal-app.html

他主张构build自定义视图来封装可重用的UI组件。 我已经采取了这种方法,但已经扩展了这个想法,把布局变化时不会布局的相关组件捆绑在一起。 例如,我有一个带有button和两个标签的进度条,所以即使我不是将它们作为一个组重用,它们需要相邻并且在概念上是相关的,所以我为它们定制了自动处理自动化视图布局贾斯汀build议。

我现在正在采取的方法,每个级别的自动布局应该只有less数的元素。 如果一个级别太复杂,我将在自定义视图中捆绑一些相关的项目,并在新视图中推入一些自动布局。 到目前为止,这不是太糟糕。

使用这么多的视图时,自动布局会非常棘手。 我已经使用了类似复杂的视图结构,并且我发现最好尽量保留代码或IB中的所有约束。 现在我们把他们留在IB。 我们将约束移入代码的唯一时间是支持不同的屏幕大小,并且我们需要修改一个约束,使视图正常工作。 我一直修改viewDidLoad我自己的约束。

当一些事情搞砸了,我几乎总是不得不把这个视图的所有约束都重新开始,重新开始。 这很糟糕,但通常比追踪问题要快。 我们做的一件事就是让事情更容易处理,就是使用.xibs和故事板。 这样,每个视图都可以处理它自己的布局,并且可以将其拖入一个坐在故事板中的视图中。