无法正确地自动调整自动布局和堆栈视图(Swift 3、Xcode 8)

Posted

技术标签:

【中文标题】无法正确地自动调整自动布局和堆栈视图(Swift 3、Xcode 8)【英文标题】:Can't get Auto Layout and Stack Views to Auto-Adjust Properly (Swift 3, Xcode 8) 【发布时间】:2016-08-12 04:37:21 【问题描述】:

我是 ios 开发的新手,所以很自然地我在 Xcode 中的堆栈视图和自动布局约束方面遇到了一些问题。最初我只使用约束和 pin 菜单来对齐所有内容,但我真的想降低堆栈视图,所以我回去实现它们。

如果您查看我上面的图片,您会发现在我的应用中我创建了几个堆栈视图:

状态栏垂直堆栈 第 1 节垂直堆栈 第一个分隔线(只是高度为 0.5 的视图,不在堆栈内) 第 2 部分包含主垂直堆栈视图内的 2 个水平堆栈 第二个分隔符(与第 2 和第 3 部分之间的第一个分隔符完全相同) 第 3 节包含一个垂直堆栈和主垂直堆栈内的水平堆栈

所有这些堆栈加上 2 个分隔符被组合在一个称为用户界面的超垂直堆栈中。

我的一个问题是我无法在堆栈和分隔符之间设置顶部和底部约束。 就目前而言,部分和分隔符之间的空间太大了。如果您查看图像 1,我尝试在第 1 节和状态栏之间设置 15 的顶部约束。我还尝试在我的第一个分隔线和第 1 节之间设置 15 的顶部约束,依此类推。我遇到了相互矛盾的约束,我只是不知道为什么。他们所说的只是Section1.top = Status Bar.bottom + 151st Divider.top = Section1.bottom + 15等。 关于如何解决冲突的任何想法?每次我尝试移动分隔线时,它都会弹回原来的位置,调整约束数字会给我同样的错误。

我的第二个问题是我无法让用户界面适应它的超级视图。我希望我的应用程序适合所有 iPhone 屏幕尺寸并进行相应的自动调整。 我尝试使用 pin 菜单并将用户界面堆栈的每一侧固定为 0 约束(未选中约束到边距) .用户界面已对齐且没有任何冲突,但随后我的所有堆栈都被压扁,如图 2 所示。这导致了一些错误,表明我的标签的某些高度和垂直位置不明确:

Height and vertical position are ambiguous for "Bill Amount Text Field". Height is ambiguous for "BILL AMOUNT". Height and vertical position are ambiguous for "Tip Percent Segment Control".

当您缩小屏幕尺寸时,会出现更多错误,因为更多标签被压扁。我已经为每个标签设置了单独的顶部和底部约束。即使我为每个标签设置了一个高度,错误消息也会消失,但并不是我的所有标签都出现在它们的堆栈中。我尝试弄乱对齐和分布菜单并为我的堆栈选择不同的菜单,但它们似乎都没有解决问题。

任何帮助将不胜感激,或者如果我要解决这一切都错了,请告诉我。我正在使用 Xcode 8 beta 4 并在 Swift 3.0 中编写了应用程序。

【问题讨论】:

【参考方案1】:

参考documentation - 对所有自动布局概念都有非常清晰的解释。 我认为您的问题是您使用一个大堆栈视图,其中每个元素与其他元素成比例地填充。尝试解决这个问题。 一个小建议,堆栈确实是个好东西,但你不应该滥用它:)

【讨论】:

【参考方案2】:

TL;DR;

根据我的经验。停止使用 Interface Builder 并在代码中创建所有视图。使用new anchor system 或SnapKit 之类的框架非常简单。您获得的好处:

更快的发展(经过一段时间的练习) 没有来自 Interface Builder 的愚蠢警告 在团队中工作时更容易合并 XCode 几乎从不崩溃

我和 IB 争吵了几个月,现在我非常高兴。 祝你好运。

【讨论】:

这与现代 iOS 开发者应该做的完全相反。设计工具的存在是有原因的——因此您可以利用它们并采用最新的做法。在整个 Xcode 和设计生态系统的整个旅程中,手动完成所有事情都是一种反实践。学习工具,只按异常跳转到代码,而不是按规则。 事实上@Marchy 我们使用“手工制作”视图已有 2 年了(在我使用界面生成器之前),让我告诉您,您在如果你使用 IB,你的应用程序如果你“手工”完成(诅咒做得很好)并不是那么容易实现的。如果您想使用它,该工具就在那里!它在某些情况下使事情变得更容易,而在其他情况下却变得非常复杂!并且不要认为因为苹果开发了它,你就必须使用它......一切都取决于你的资历,你的项目和需求,没有一种方法可以做事。 XCode Interface Builder 仅作为入门级的 iOS 开发初学者而创建。如果开发人员一段时间后坚持IB,那就是他的水平。您永远不会像在代码中那样获得这种级别的灵活性和维护性。

以上是关于无法正确地自动调整自动布局和堆栈视图(Swift 3、Xcode 8)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小

自动布局:UILabel 无法正确调整长文本的大小

Cocoa 自动布局和调整子视图的大小

Swift 无法让 UICollectionView 正确布局

在启用自动布局的情况下调整 swift/xcode 中的按钮大小

Swift - 大屏幕上的自动布局调整大小按钮