如何准备 UIViewController 的视图以添加到 UIStackView?
How do I prepare a UIViewController's view for being added to a UIStackView?
这就是我想要做的...
我有一个视图控制器需要根据某些数据的存在动态显示不同的子视图。
这是一个简单的模型。 每个彩色块代表一个独特的子视图。
有时绿色块需要在顶部,有时绿色块根本不会显示,有时浅蓝色块会有所不同,等等。
每个子视图都有交互元素,所以我一直在创建和添加它们:
- 定义一个新的视图控制器
- 定义其视图
- 调用
addChildViewController
和 didMoveToParentViewController
- 在
myNewViewController.view
上调用 addSubview
- 使用 SnapKit 进行自动布局约束来定位视图
我想过渡到 UIStackView
因为它似乎是这个视图的一个很好的支持系统,因为我需要做的就是堆叠它的子视图。在尝试添加具有自己的内部自动布局约束的子视图时,我看到许多冲突的约束错误和意外的视图框架。
问题
我是否将 4-6 个视图控制器的视图嵌入到一个视图控制器的视图中,从而让自己失败?
此外,我如何为添加的视图提供最小高度或内容大小等属性,而不会看到 UIStackView
的许多突破性限制? (所以他们可以堆叠,但是其中一个是 400 高,另一个是 200 高)
回答
您完全可以使用 UIContainerViews
结合 UIStackViews
和 UIScrollViews
来完成此操作,这是一个复杂的设置,因此这里有一个入门项目可以帮助您入门:
https://github.com/Rnorback/ScrollingStackView
项目如下所示:
您希望容器具有不同的大小。为此,只需使用自动布局向容器添加高度限制。如果你想改变滚动的高度。然后您需要更改 UIStackView
.
的高度限制
简要说明
创建此设置时,您必须确保 UIStackView
distribution
设置保持填充状态。这样你就可以在 UIContainerViews 上设置高度限制。
在 UIScrollView
中设置任何内容时,您必须确保对象固定在滚动视图的边缘并具有定义的宽度和高度,否则滚动视图将抛出约束错误。我认为它就像 scrollview 试图压入内容视图的所有侧面,如果有任何一侧给出,scrollview 将无法正确显示它。
希望对您有所帮助。
这就是我想要做的...
我有一个视图控制器需要根据某些数据的存在动态显示不同的子视图。
这是一个简单的模型。 每个彩色块代表一个独特的子视图。
有时绿色块需要在顶部,有时绿色块根本不会显示,有时浅蓝色块会有所不同,等等。
每个子视图都有交互元素,所以我一直在创建和添加它们:
- 定义一个新的视图控制器
- 定义其视图
- 调用
addChildViewController
和didMoveToParentViewController
- 在
myNewViewController.view
上调用 - 使用 SnapKit 进行自动布局约束来定位视图
addSubview
我想过渡到 UIStackView
因为它似乎是这个视图的一个很好的支持系统,因为我需要做的就是堆叠它的子视图。在尝试添加具有自己的内部自动布局约束的子视图时,我看到许多冲突的约束错误和意外的视图框架。
问题
我是否将 4-6 个视图控制器的视图嵌入到一个视图控制器的视图中,从而让自己失败?
此外,我如何为添加的视图提供最小高度或内容大小等属性,而不会看到 UIStackView
的许多突破性限制? (所以他们可以堆叠,但是其中一个是 400 高,另一个是 200 高)
回答
您完全可以使用 UIContainerViews
结合 UIStackViews
和 UIScrollViews
来完成此操作,这是一个复杂的设置,因此这里有一个入门项目可以帮助您入门:
https://github.com/Rnorback/ScrollingStackView
项目如下所示:
您希望容器具有不同的大小。为此,只需使用自动布局向容器添加高度限制。如果你想改变滚动的高度。然后您需要更改 UIStackView
.
简要说明
创建此设置时,您必须确保 UIStackView
distribution
设置保持填充状态。这样你就可以在 UIContainerViews 上设置高度限制。
在 UIScrollView
中设置任何内容时,您必须确保对象固定在滚动视图的边缘并具有定义的宽度和高度,否则滚动视图将抛出约束错误。我认为它就像 scrollview 试图压入内容视图的所有侧面,如果有任何一侧给出,scrollview 将无法正确显示它。
希望对您有所帮助。