2012-08-29 40 views
2

有没有像您可以使用Android布局相对于彼此的任何位置视图?iOS:相对定位像Android的布局

例如:您有动态设置为可变长度的字符串,一上一下两个其他UILabels,和你想要的底部标签直接出现在顶部标签的最后一行之下,不管有多少行顶部标签结束了。

另一个例子:与上述情况相同,但其中一个标签有时隐藏。您希望生成的标签在父级中垂直居中,而不管它是一个标签还是两个标签。

Android的线性布局和相对布局使这很容易做到,但我无法弄清楚如何做到这一点是iOS。可以做到吗?

回答

0

你可以在iOS6中使用AutoLayout来做到这一点。对于应该在6.0之前的iOS中运行的应用程序,您必须自己完成,但这并不复杂。

其实我已经实现a class to do this(那是很久以前的事,我希望它仍然有效,但没有理由不)。这是OHStackView类是UIView的子类,它可以水平或垂直自动布局子视图以堆叠或对齐它们。

您可以要求OHStackView水平或垂直堆叠子视图(一个在另一个之上等),或者对齐其顶部/底部/左侧/右侧边界或其中心,甚至在每个子视图之间指定填充。每当子视图中的一个改变其框架或大小时,OHStackView将自动重新布局所有依赖视图以重新排列所有内容。 (延续与你的两个UILabels,以sizeToFit一个简单的调用你的标签,使他们调整自己的大小以他们的内容将重新布局周围的一切都自动地)

提供了可以随意测试的示例项目。

注:IIRC,我的子类不考虑子视图的“隐藏”属性。但是,您可以通过在其layoutSubview实现的for循环中添加条件(如if (v.hidden) continue;)来轻松添加对此行为的支持,以便仅在布局算法中考虑非隐藏视图。

HTH

+1

AutoLayout听起来像我所需要的。我无法相信它现在才被添加! –

+0

是的,但我想这主要是因为iPhone设备都具有相同的屏幕尺寸,与Android设备相反。因此,一般来说,您不需要Android中的布局,您可以为所有内容定位您的内容。至少到现在为止,但由于未来iPhone 5的屏幕尺寸可能与其前一版本不同,因此AutoLayout将会更加需要。无论如何,我的OHStackView仍然可以为需要在6.0之前与iOS兼容的应用程序完成这项工作 – AliSoftware

0

我一直在寻找是否有可能很长一段时间。据我所知,现在是不可能的。我不记得我在哪里阅读这篇文章,但是使用ios6将是可能的。您可以使用sizeWithFont方法来检测您的UILabel的大小,而不是使用Android的线性布局,您可以设置它们的框架来定位它们。首先,您需要设置其文本,以根据其字体系列来查找它们的大小。另一件你可以使用的方法是sizeToFit。不幸的是,我不知道如何使用它。不过,你可以投篮。那时候,我发现了这个。也许你可以使用它https://github.com/scalessec/CSLinearLayoutView