将带有 ScrollView 和 AutoLayout 的 UIViewController 添加到另一个 UIViewController

Posted

技术标签:

【中文标题】将带有 ScrollView 和 AutoLayout 的 UIViewController 添加到另一个 UIViewController【英文标题】:Adding UIViewController with ScrollView and AutoLayout to another UIViewController 【发布时间】:2014-03-03 19:28:59 【问题描述】:

我有一个 UIViewController(添加到 UINavigationController),它使用标准代码添加另一个 UIViewController 的视图:

[self addChildViewController:toVC];
[self.view addSubview:toVC.view];
[toVC didMoveToParentViewController:self];

这很好。

childViewController 的 (toVC) 视图是使用 Interface Builder 和 Auto Layout 构建的,它包含一个 UIScrollView。如果我将 toVC 加载到我的应用程序中,直接加载到 UINavigationController(而不是将其添加到另一个视图控制器)中,滚动效果很好。

但是,当使用上面的代码将 toVC 添加到我的 mainVC 时,toVC 的 scrollView 根本不滚动,我不知道我需要做什么。

【问题讨论】:

是否有必要将其添加为子视图?如果你展示viewController,它会起作用吗? 如果我从我的 masterVC 发出 [self presentViewController:toVC ...],scrollView 仍然不滚动。 ***.com/questions/2824435/uiscrollview-not-scrolling -- 您尝试过这些解决方案吗? 是的,就像我提到的,如果我直接将它加载到 UINavigationController 中,它工作正常,所以我对我设置的约束感觉很好。只有当我在滚动停止工作时将 UIScrollView 添加到另一个 UIViewController 的视图时。 几周前我遇到了类似的问题,但我不记得我是如何解决的。我记得这是一个奇怪的东西,我会看看我能不能弄清楚。抱歉,我帮不上忙。 【参考方案1】:

您应该设置子视图控制器视图的框架和自动调整掩码/自动布局约束。即使子控制器的视图设置为自动布局,它仍然需要使用父控制器使用的任何系统定位在父视图控制器的视图中。

编辑:另一个潜在问题,因为您提到滚动视图在呈现时不会滚动:

您是否为滚动视图的子视图设置了上、左、右、下约束?滚动视图对“空间到超级视图”约束的处理与普通视图不同;这些约束不是定义其子视图的位置,而是定义内容大小。未能在上下或左右都设置约束可能会使滚动视图的内容大小为 0, 0,在这种情况下滚动视图不会滚动。

【讨论】:

你能解释一下“即使子控制器的视图设置了自动布局,它仍然需要定位在父视图控制器的视图中”是什么意思?我有同样的问题。我有两个 childVC,我不确定如何在 parentVC 的滚动视图中设置它们。人们说如果我们使用自动布局,我们不应该手动设置框架和内容大小。那么我将如何管理您上面所说的内容? @aytunch 我的意思是子视图控制器的子视图是通过自动布局管理的,但是它的视图与父视图控制器的视图的关系仍然需要定义。 controller.view.translatesAutoresizingMaskIntoConstraints = false 为我节省了很多时间

以上是关于将带有 ScrollView 和 AutoLayout 的 UIViewController 添加到另一个 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

带有渐变的SwiftUI ScrollView文本

带有 TabLayout 的片段内的 ScrollView 不滚动,为啥?

远程图像使用 List 正确加载,但在使用带有嵌入式 VStack 的 ScrollView 和 SwiftUI 时不加载

带有分页 iphone sdk 的 ScrollView

包含带有很多按钮的 ImageView 的 ScrollView

带有 StackView 和固定页脚的 ScrollView