基于子视图灵活调整UIView大小的可靠解决方案

Posted

技术标签:

【中文标题】基于子视图灵活调整UIView大小的可靠解决方案【英文标题】:Solid solution to flexibly resize UIView based on subviews 【发布时间】:2014-09-01 19:36:17 【问题描述】:

假设您有四个左右的视图,宽度均为 100,高度不同。您有一个包含所有内容的包装视图 W。

A   |
B   |  W
C   |
D   |

小视图的高度可以改变。那时你希望它们都移动、浮动、适当地调整 W 的大小。

现在,我正要写几行代码来做到这一点。

所以 .. (1) 你会让 W 找到所有子视图并按从上到下的顺序列出它们。然后 (2) 每次发生变化时,您将 (3) 重新定位每个 ABCD。每一个的位置是它上面的项目的高度之和,并且(4)将W调整为所有高度的总和。

现在一切都很好,但是——白痴重新发明***!

我在 ios 中是否遗漏了一些明显的东西?是否已经有一个每个人都在使用的软件包?还是内置的东西?什么情况?

(请注意,当然令人沮丧的是,对于我们的 android 朋友来说,这是内置的!当然任何 web-html 系统都会自动执行此操作。)

iOS 视图的正确工程解决方案是什么?作为记录,这只是 iOS7+,如果有影响的话,不需要覆盖老式的东西。干杯

【问题讨论】:

你在 iOS 中遇到过 Auto Layouts 的概念吗? 伙计,我还没有完成一个带有自动布局的项目..他们完全解决了这个问题吗?所以,在这个例子中,如果我让 C 更高.. 它会自动移动 D,并自动让 W 更大吗?谢谢 只要将 D 的约束设置为始终存在于 C 之下,是的。为了“自动”使 W 变大,如果没有任何效果,您始终拥有 sizeToFit。 :) 使用AutoLayout,你的生活会更轻松 【参考方案1】:

(1) 你会让 W 找到所有子视图并从顶部按顺序列出它们 到底部。然后(2)每次发生变化时,你会(3)重新定位 每个 ABCD。每个人的位置是高度的总和 它上面的项目,以及 (4) 将 W 调整为所有高度的总和。

您可以在整个过程中使用 Interface Builder 中的约束,无需任何代码。这样做:

设置子视图A的宽度为100 约束 B、C 和 D 以匹配 A 的宽度 在 A 和 B、B 和 C、C 和 D 之间添加垂直间距约束,以保持它们的相对位置 在 W(超级视图,以灰色显示)和 A 之间添加垂直间距约束 在 W 和 D 之间添加垂直间距约束 在 W 和视图 A 之间添加前导和尾随空格约束

你最终会得到如下所示的东西:

Xcode 中的约束编辑器并不完全直观,但它很容易使用,一旦您了解了在 IB 中可以做什么和不可以做什么以及需要使用代码来处理设置约束。

【讨论】:

嗨,迦勒!那就清楚了。 当应用程序运行时,如果我改变其中两个项目的高度......那么,在那一刻,其他三个将被移动,所以关系仍然存在?谢谢。另外,TBC,您是否也可以使用您出色的技术以某种方式纯粹在 IB 中进行“持有视图”(在我的示例中为 W)?!谢谢! 是的,这就是自动布局的重点。您在视图之间创建一组约束,并且每当任何受影响的对象发生更改时,自动布局都会尝试满足这些约束。我将编辑答案以明确灰色矩形是您的“持有视图”W。 令人震惊。你可以做一些事情,比如说,想象一个游戏,你可以用手指调整它们的大小。您所说的这种“自动布局”将完全负责移动其余部分。谢谢!为什么不是每个人都一直使用这个?!我只是做了一个折叠面板的事情。当它崩溃时我手动移动其他东西:愚蠢,对吧?我可以用这个! 你说得对——它非常有用。它也不是什么新东西,在 iOS 6 中已经引入。Apple 有一个 guide 详细介绍了它——你应该阅读它。

以上是关于基于子视图灵活调整UIView大小的可靠解决方案的主要内容,如果未能解决你的问题,请参考以下文章

调整旋转 UIView 的子视图大小

UIView 调整大小但不是子视图

用动画调整 UIView 的大小,子视图不会动画

使用自动调整子视图大小为 UIView 帧大小更改动画

根据子视图大小调整 XIB 中的 UIView 大小

iOS UIView 不调整子视图的大小?