我总是在代码中使用UI,但我决定在当前的项目中使用故事板和自动布局。一切都进行得很顺利,直到我建立了一个复杂的场景,大约有50个视图,有很多层次结构和一些视图网格。
问题是我的汽车布局在一些设备和方向上变得混乱。我发现用IB来尝试修复几十个(数百?)是很有挑战性的。或者追踪问题并解决它们。情况是这样的,我没有收到错误或警告,只是一些令人不快的布局有时。IB可能是一个痛苦的所有点击和更改设置,您需要做的跟踪约束信息,更不用说获得一个完整的概念,它们是如何在一个场景。
我刚刚花了一天时间阅读有关自动布局和约束的文档和背景材料,似乎我最好的解决方案是使用可视化格式在代码中指定约束,并创建一些自定义代码以提供帮助。但是,我似乎找不到任何关于如何从IB转换到代码的东西。
具体来说,我应该消除所有IB限制,并将它们全部手工完成,还是有可能是选择性的?我之所以这样问,是因为我在包含内容视图有一个完美布局的视图方面有一些观点组。
第二,我应该把我的代码放在哪里?我想要共存的故事板,只是想有选择地修改一些复杂的场景。视图控制器的viewWillAppear:为其控制的视图修改或删除/添加约束的合适位置吗?
发布于 2014-03-24 05:47:23
很抱歉,在其他项目被侵入的时候,这么长时间才回到这个位置。
我不得不做很多重构,以简化我的场景,以便自动布局可以做正确的事情,但我并不完全满意的结果。问题似乎是,IB只是不容易使用与许多项目,和汽车布局是复杂的,出于必要。
话虽如此,到目前为止我看到的最好的结果都是从贾斯汀·德里斯科尔:http://themainthread.com/blog/2014/02/building-a-universal-app.html的这篇文章中得出的。
他主张构建自定义视图来封装可重用的UI组件。我采用了这种方法,但扩展了这个想法,也将相关组件捆绑在一起,这些组件不会随着布局的变化而有很大不同的布局。例如,我有一个带有按钮和两个标签的进度条,所以即使我没有将它们作为一个组重用,它们也需要相邻并且在概念上是相关的,所以我为它们创建了一个自定义视图,按照Justin的建议处理自动布局。
我现在采用的方法是,每个级别的自动布局都应该只有少数几个元素。如果一个级别变得太复杂,我将在一个自定义视图中捆绑一些相关的项,并将一些自动布局推到该新视图中。到目前为止还不算太糟。
发布于 2014-01-08 23:23:38
将您希望能够在情节提要/xib文件中修改的IBOutlet连接到控制器/视图类。
一旦连接了布局对象,就可以修改.constant属性并动画视图:
[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或事件的修改代码。这取决于你的意图。
发布于 2014-01-08 23:14:55
当使用这么多视图时,自动布局可能非常棘手。我使用过类似的复杂视图结构,我发现最好在代码或IB中保留所有约束。现在我们把他们关在IB里。只有当我们支持不同的屏幕大小时,我们才能将约束移动到代码中,并且需要修改一个约束才能使视图正常工作。我自己一直在修改viewDidLoad中的约束。
当某件事情搞砸了,我几乎总是要对这个视图上的所有约束进行核弹,然后重新开始。这很糟糕,但往往比追踪问题要快得多。我们所做的一件事使处理这类事情更容易,那就是将.xibs和你的故事板一起使用。这样,每个视图都可以处理自己的布局,您可以将其拉到一个位于故事板中的视图中。
https://stackoverflow.com/questions/21008444
复制相似问题