IOS / Autolayout可能只用于顶视图而不设置子视图?

Posted

技术标签:

【中文标题】IOS / Autolayout可能只用于顶视图而不设置子视图?【英文标题】:IOS/Autolayout possible for just top view without setting for subviews? 【发布时间】:2017-05-01 13:55:25 【问题描述】:

我使用为 iPhone SE(或 5)优化的尺寸检查器,主要依赖硬编码尺寸,在不使用自动布局的情况下制作了一个应用程序原型。

我这样做的主要原因是缺乏自动布局的知识,以及在进行这样或那样的更改后重做约束的困难。

我现在面临的问题是,SE 大小的应用程序屏幕不够大,无法填满 iPhone 6 或特别是 7 plus 的空间。根据 SE 和其他目标之间的差异,屏幕会在顶部和底部留下大小不一的黑色边框。

每个屏幕的元素通常包含在每个视图控制器的一个视图中。

我想知道是否有任何方法可以设置一些约束来扩展主视图以调整到手机屏幕大小,而不需要对视图中的每个元素进行约束?

如果没有,我会硬着头皮开始设置几十个约束,但想知道是否有可能的极简方法。

【问题讨论】:

【参考方案1】:

其实有一种方式叫UIViewAutoresizing,不过严格依赖于布局。参考:https://developer.apple.com/reference/uikit/uiview/1622559-autoresizingmask

【讨论】:

现在是不是必须使用自动布局?自动调整大小似乎是较旧的方法。 在不了解细节的情况下很难推荐特定的东西。我会选择自动布局。 我的意思是你能不能只为最外层的视图设置约束,让它填满屏幕而不为每个元素(子视图)添加约束?【参考方案2】:

既然你决定坚持使用自动布局...

假设您在场景中有许多 UI 元素(让我们说一些在其他元素中),而起初您根本没有设置任何约束。

一开始您对所有/或几乎所有元素不满意自动布局。这是因为您根本没有为它们中的任何一个设置任何内容(没有约束/自动调整大小掩码等)。所以在运行时/屏幕尺寸变化等期间对旋转/移动的反应对于每个人来说几乎是不可预测(我们就称之为“reaction ”)。

如何解决?我们知道有一个名为“约束”的解决方案

约束设置两个元素(不是3、4或... n - 许多)之间的关系,其公式为 UIView.attribute1 = multiplier * UIView2.attribute2 + constant B

让我们从第一个 UI 元素(您的 SomeView - 我们称之为 View1)开始,它是 Superview 的子元素。 一开始你对它的反应并不满意。所以你为那个特定的元素设置了约束。你在现场布置它。

现在你有了新的关系

UIView1.attribute = UIViewNth.attributeN + B 。 //实际上是UIView1.attribute1 = Superview.attribute2 + B

仅在 2 个元素之间设置:超级视图和 ONE(不是很多)特定元素(您的 SomeView,我们刚刚称为 View1)。 //(您为 ONE 特定元素 - View1 - 即“SomeView”设置了布局/约束)。

您为其中两个实现了解决方案(实际上是一个,不考虑 Superview,-对于 someView,它是场景的 superView 的子视图)。 现在您可以预测 SomeView 对 Superview 的反应

其余所有 UIElement 的反应仍然仍然无法预测。所有其余的 UI 元素彼此无关,并且其中任何一个元素都无关。 没有为其中任何一个(其余 UI 元素)设置布局

您有 1 个工作正常。还不满意?

让我们走得更远。

现在您为第二个 ONE 特定元素设置约束。您可以通过建立现在第二个和 Superview/或场景上已经粘贴(与某处相关)的其他第 n 个 UI 元素之间的关系来布局它,因此第二个将粘贴到第 n 个他们不会一起搬走/崩溃/等等。第一贴第二贴,第二贴第三贴等等。

所以现在你有了新的关系

UIView2.attribute3 = Uiview1.attribute4 + A(A 是某个值)。 //或UIView2.attribute3 = Superview.attribute4 + A(某个值)。

现在您可以预测对 第二个 UI 元素的反应。它的反应符合第一个元素。

或与 Superview/或1st 元素(已坚持到 superview)。由您决定。

此时此刻你总共拥有

[Superview] - [View1] 关系/您为第一个视图做了布局 1/设置约束 ([Superview] - [View1])

[View1] - [View2] 关系/您已布局第二个视图/为第二个视图设置约束 ([View2] - [View1])

场景中的所有其余 3...n 元素仍然不可预测。我们称它为 k...n,其中 n 是最后一个。不满意?

现在您像以前一样为 k-th 元素 设置布局。您的场景中的 k-1 个 UI 元素仍然不满意

……等等

在您的场景中重复直到第 n 个(最后一个)UI 元素


所以回答你的问题。不。如果您有许多 UI 元素并希望它们中的大多数在运行时做出正确反应,那么没有短的(少约束方法)解决方案。

【讨论】:

以上是关于IOS / Autolayout可能只用于顶视图而不设置子视图?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Autolayout:调整大小父视图中的 UILabels 问题

滚动视图中的 UITextView 与 Autolayout iOS 不工作

iOS 嵌套 UIScrollViews 使用 AutoLayout

显示模态后移动视图 - 可能与 AutoLayout 相关

AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?

如何使用AutoLayout(iOS / Xamarin.iOS)使ScrollView适合其内容?