内容视图自动布局

Posted

技术标签:

【中文标题】内容视图自动布局【英文标题】:Content View AutoLayout 【发布时间】:2015-07-27 21:19:43 【问题描述】:

我正在尝试将容器视图添加到我的项目中,但遇到自动布局问题。在这个容器视图中,我将其子类化为某种类型的 UIViewController,我将其命名为 ContainerViewController。我试图在堆栈溢出时找到它,所以如果它已经发布,我深表歉意。无论如何,从这个视图控制器,我试图实现类似于this 的效果,其中标签基本上附加到 ContainerViewController(红色视图)视图的底部,并与此水平居中。但是,每当我尝试这样做(我正在以编程方式执行此操作)时,一切都会变得混乱。我将容器视图的边缘附加到 UILabel(全零),并将顶部附加到矩形。我尝试在 -prepareforsegue 方法中设置 childviewcontroller,我尝试更改缩放因子,我尝试将容器视图设置为固定大小,我尝试将授权因子设置为灵活,我尝试了几乎所有我能想到的而且我并不接近解决方案。当我设置视图的背景颜色时,它完全可以正常工作:背景颜色变成红色,就像上面的例子一样,在它应该有的空间量中。

问题:我在 -viewdidload 方法中将 UILabel 添加到 ContainerViewController 的视图中,发现 ContainerViewController 的视图与我正在使用的屏幕尺寸完全相同,并且 UILabel 附在 view 的底部,但我只能看到容器屏幕的视图范围。所以 ContainerViewController 的视图不尊重容器视图的边界。如果我需要更好地解释这一点,或者您有任何问题,请告诉我。任何帮助将不胜感激,谢谢!

TLDR:正在发生的事情是容器视图具有自动布局的正确约束,并且仅显示在其边界内发生的事情。但是,containerView 中的 UIViewController 有一个不尊重容器视图边界的视图;就好像 uiviewcontroller 与屏幕的主视图具有相同的视图大小。

【问题讨论】:

【参考方案1】:

我相信您基本上已经解决了这个问题:您手动添加到容器视图的视图不会像您预期的那样自动将自身约束到其父级(我自己错误地做出了这个假设)。您需要使用编程自动布局将边缘显式绑定到父容器视图控制器。

我最终使用PureLayout 自己解决了这个问题。 See this answer to my own question了解更多详情。

[newView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];

【讨论】:

感谢您的快速回复!我没有意识到它不遵循这种行为,谢谢你让我知道。但是我仍然有一个问题。出于某种原因,我的超级视图为零,这意味着 ContainerViewController 没有超级视图。但是,我在 -prepareforsegue 方法中明确地将 ContainerViewController 的视图添加到主视图的子视图中。我究竟做错了什么?为什么ContainerViewController的view没有superview? 我发现了我的问题,我现在意识到我需要在 -ViewWillLayoutSubviews 方法中添加这个方法,不幸的是这不起作用。不过感谢您的建议!

以上是关于内容视图自动布局的主要内容,如果未能解决你的问题,请参考以下文章

为啥我取消选中内容布局指南后通过了自动布局检查

如何使用自动布局设置滚动视图内容大小?

自动布局和集合视图问题

如何在 ios 中使用自动布局更改滚动视图内容大小

自动布局和滚动视图宽度固定到屏幕(不是内容)

iOS自动布局与滚动视图:内容大小问题