Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在代码中修改情节提要自动布局约束的最佳实践?_Ios_Autolayout_Uistoryboard - Fatal编程技术网

Ios 在代码中修改情节提要自动布局约束的最佳实践?

Ios 在代码中修改情节提要自动布局约束的最佳实践?,ios,autolayout,uistoryboard,Ios,Autolayout,Uistoryboard,我一直在用代码编写UI,但我决定在当前项目中使用故事板和自动布局。一切都进行得很顺利,直到我构建了一个复杂的场景,大约有50个视图,有很多层次和一些网格视图 问题是我的自动布局在某些设备和方向上变得混乱。我发现使用IB来修复几十(数百?)个约束或跟踪问题并解决它们是一项挑战。情况是这样的,我没有得到错误或警告,只是一些不愉快的布局有时。IB是一个痛苦的东西,你需要点击和更改设置来跟踪约束信息,更不用说完全了解它们在场景中的关系了 我刚刚花了一天的时间阅读了有关自动布局和约束的文档和背景资料,似乎

我一直在用代码编写UI,但我决定在当前项目中使用故事板和自动布局。一切都进行得很顺利,直到我构建了一个复杂的场景,大约有50个视图,有很多层次和一些网格视图

问题是我的自动布局在某些设备和方向上变得混乱。我发现使用IB来修复几十(数百?)个约束或跟踪问题并解决它们是一项挑战。情况是这样的,我没有得到错误或警告,只是一些不愉快的布局有时。IB是一个痛苦的东西,你需要点击和更改设置来跟踪约束信息,更不用说完全了解它们在场景中的关系了

我刚刚花了一天的时间阅读了有关自动布局和约束的文档和背景资料,似乎我的最佳解决方案是使用可视化格式在代码中指定约束,并创建一些自定义代码以提供帮助。然而,我似乎找不到任何关于如何从IB转换到代码的信息

具体地说,我应该擦除所有IB约束并手动完成它们,还是可以选择?我这样问是因为我在包含视图中有一些视图组,其中内容视图具有完美的布局


其次,我最好把代码放在哪里?我想共存故事板,只想有选择地修改一些复杂的场景。视图控制器的视图是否会出现:修改或删除/添加其控制的视图约束的正确位置?

使用这么多视图时,自动布局可能非常棘手。我使用过类似的复杂视图结构,我发现最好将所有约束保留在代码或IB中。现在我们将它们保留在IB中。我们将约束移动到代码中的唯一时间是当我们支持不同的屏幕大小时,我们需要修改单个约束以使视图正常工作。我总是自己修改viewDidLoad中的约束


当事情变得一团糟时,我几乎总是要取消该视图上的所有约束,然后重新开始。这很糟糕,但通常比追踪问题要快。我们所做的一件事是将.xibs与您的故事板一起使用,这使得处理此类事情更加容易。这样,每个视图都可以处理自己的布局,您可以将其拉入故事板中的视图。

将您希望能够在故事板/xib文件中修改的NSLayoutConstraint的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、ViewDidDisplay或基于事件中添加修改代码。这真的取决于你的意图。

很抱歉,在其他项目受到干扰时,花了这么长时间才回到这个问题上

我不得不做很多重构来简化我的场景,以便自动布局可以做正确的事情,但我对结果并不完全满意。问题似乎是IB不容易与许多项目一起使用,而且自动布局很复杂

话虽如此,到目前为止我看到的最好结果来自Justin Driscoll的这篇文章:

他主张构建自定义视图来封装可重用的UI组件。我采用了这种方法,但也扩展了这个想法,将相关组件捆绑在一起,这些组件在布局改变时不会有很大的不同。例如,我有一个带有按钮和两个标签的进度条,所以即使我没有将它们作为一个组重用,它们也需要相邻,并且在概念上是相关的,所以我为它们创建了一个自定义视图,它按照Justin的建议处理自动布局


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

我想我有太多的限制将它们连接到IBOutlets,但是如果我可以将我的更改减少到一小部分,这可能会起作用。我需要稍微研究一下这个问题才能做出决定,但如果所有约束都在代码中,那么看起来可能会更容易做很多工作。我的目的是修复约束,使它们在所有设备配置中都能工作。如果我能帮忙的话,我不打算动态地改变它们。我想ViewWillEmbeen可能是设置它们的地方,但您的评论让我怀疑这是否是正确的地方。awakeFromNib在使用故事板时是否会触发?它是移除/添加约束的正确位置吗?加载viewDidLoad是否太晚了?当用户可以看到场景时,它会导致场景发生变化吗?当从情节提要反序列化视图(控制器)时,确实会调用awakeFromNib:此处的更多信息:我会在viewDidLoad或awakeFromNib中设置约束,这取决于您在didLoad中进行其他视图层次修改的意图。在故事板中实际设置所有约束的问题是什么?试试新的beta xcode,它有一些改进。还可以查看自动布局WWDC13会话..谢谢,Ron。我将查看文档并再次观看会话。我在IB中这样做的问题是,一旦你有超过100个限制,点击和跳跃的数量就会变得很痛苦,并破坏注意力。不幸的是,IB似乎并不总是保持UI的状态,因此当您返回到某个菜单或编辑器时,该菜单或编辑器将恢复为默认状态。IB已经走过了漫长的道路,我理解它试图解决的问题的复杂性,但我发现,当我有这么多实体时,命名对象、分组、排序和用代码组织它们要容易得多。而且,当你选择“添加缺少的结构”这样的选项时,你永远不知道IB是否会做你想做的事情