如何使以编程方式生成的子视图符合超级视图(iOS)的边界?

Posted

技术标签:

【中文标题】如何使以编程方式生成的子视图符合超级视图(iOS)的边界?【英文标题】:how to make a programmatically generated subview conform to the bounds of the superview (iOS)? 【发布时间】:2013-10-03 20:10:34 【问题描述】:

我有一个名为 containerView 的包含视图,它是一个 UIView。当应用程序启动时,它只是那个视图。在应用程序执行过程中,我想在主容器视图中交换两个“全尺寸”子视图。

我的问题是,无论 iPad 的方向如何,我如何确保子视图填满整个 containerView。 containerView 的宽度为 300,但高度因方向而异。

我试过了: 从viewDidLoad、viewWillAppear、viewDidAppear设置子view的frame直接等于containerView frame的边,

创建 LayoutConstraints 强制子视图符合来自 viewDidLoad、viewWillAppear 和 viewDidAppear 的 containerView 比例。这里的问题是何时应用这些约束,并且由于视图会定期删除,何时重新应用约束。

我不知道惯用的方法是什么,我希望我的代码是可维护和可重用的。我是以错误的方式接近这个吗?还有其他方法可以确保子视图填满其包含的视图吗?

示例代码: https://gist.github.com/Sahasrara/6817105

【问题讨论】:

你有没有在添加子视图之前使用超级视图的边界并在添加子视图之后设置约束? 您好,感谢您的回复。我已经试过了。作为参考,我将尝试用一些示例代码来改变这个问题。我一开始就有刷新布局,这样superview的边界是正确的,否则太小了。 【参考方案1】:

您应该在 viewDidLayoutSubviews 中设置帧大小。到那时所有的自动布局废话都发生了。

【讨论】:

所以你认为我应该放弃以编程方式使用约束,只需将框架设置为 viewDidLayoutSubviews 中的超级视图边界???它似乎有效,我只是想确保我理解并且这是惯用的做事方式。我真的在努力争取正确性和可维护性。 我说的是一般使用约束。他们工作得很好。对于特殊情况的工作,您需要介入并将事情掌握在自己手中。在 viewDidLayoutSubviews 中执行此操作似乎是执行此操作的最佳位置。它在几个应用程序中运行良好,其中一个拥有数十万活跃用户。此外,我们还可以访问视图生命周期的这一部分以及 Autolayout 的实现。显然,我们获得了这种访问权限,可以完全按照您正在做的事情类型进行操作。 好的,非常感谢您的帮助。我已经为此苦苦挣扎了两天了。你让我成为一个快乐的人。

以上是关于如何使以编程方式生成的子视图符合超级视图(iOS)的边界?的主要内容,如果未能解决你的问题,请参考以下文章

当内部按钮触摸时,如何从 Superview 中删除以编程方式创建的子视图?

如何创建一个动态弹出并扩展其超级视图大小的子视图。 (在代码中)

如何以编程方式将视图的底部约束从安全区域更改为超级视图?

如何在 iOS 中滑动 UIViewController 中包含的子视图控制器?

如何以编程方式为情节提要中的子视图设置视图控制器?

如何以编程方式将 UIView 粘贴到其超级视图的右侧