2014-10-20 59 views
2

我在使用包含多个子视图的UIScrollView时遇到麻烦。其中一个高度根据文本的长度进行动态计算,并在较高时将其下面的内容向下推。iOS 8 - 具有动态高度的儿童的UIScrollView

这是这个应用程序的Android版本截图:

Android version

下的绿色标题描述的观点是,改变高度,如果介绍大于一行的看法。这意味着我无法在所有视图上使用高度约束,这似乎是在故事板中使用自动布局时使UIScrollView工作的原因。

会是什么把一个UIScrollView从包含多个子视图就像上面的截图中,,将所有屏幕宽度(iPhone 4,iPhone 5,iPhone 6,工作等情节提要一个UIViewController内的最佳途径。)并允许视图高度变化,同时保持其相对于其他视图的位置?

这就是我的故事板和这个特定的视图控制器看起来像:

Storyboard layout

回答

3

这样做的“iOS方式”是使用UITableViewController(它又是UIScrollView子类)。

您可以使用Storyboard和原型单元轻松创建一个。

至于高度,你可以使用一个参考UILabel并在表视图委托的tableView:heightForRowAtIndexPath:,传递0的行数返回其textRectForBounds:limitedToNumberOfLines:

您也可以看看我们使用的this library以及它如何处理dynamic heights

+0

这实际上是我之前做的,它在iOS 8之前工作正常,但无论出于何种原因,它停止使用较大的屏幕宽度。也许我必须再试一次。 – afollestad 2014-10-26 19:04:32

-2

你仍然可以使用一个高度约束,你只需要先计算该子视图的高度。

要计算在其文本UILabel的大小,使用这样的事情:

[textString boundingRectWithSize:CGSizeMake(screenWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : fontForLabel} context:nil]

+0

那么我使用sizeToFit()来调整'UILabel'来适应文本。我不会从代码生成约束,约束都在故事板中设置。 – afollestad 2014-10-20 20:39:31

+1

然后不要使用故事板:)编码是更加灵活IMO。如果我是你,我会为该索引使用带有自定义单元格的UITableView。并使用上面提供的@ AdamPro13方法返回正确的高度。 – simonthumper 2014-10-20 20:43:21

+0

我之前使用过一个TableView,它现在不能很好地工作,现在iOS 8的屏幕宽度不同。在故事板中使用约束比使用代码IMO更简洁。 – afollestad 2014-10-21 20:35:44

0

做到这一点,正确的方法是设置行数在标签为0,会给它灵活的高度。然后将标签的顶部和底部锚定到其上方和下方的邻居。 UIScrollView必须能够通过增加其所有内容的儿童身高的高度来达到其内容的高度。

+0

谢谢,我会试试这个,并将其标记为正确的,如果它工作 – afollestad 2014-10-21 15:08:35

+0

我更新了帖子,并在屏幕截图中显示了视图控制器在故事板中的样子以及如何布置视图树。该标签的行号为0. – afollestad 2014-10-21 20:33:46