【问题标题】:How to resize UITextView and then UITableViewCell based on UITextView's content如何根据 UITextView 的内容调整 UITextView 和 UITableViewCell 的大小
【发布时间】:2014-03-30 01:12:20
【问题描述】:

我看到了一些类似的问题,但其他适用于其他人的解决方案都不适用于我,所以请不要将其标记为重复。我已经尝试了三天的替代解决方案,但没有成功。

作为应用程序的一部分,我的承包商要求我有一个标签,允许用户阅读带有特定主题标签的推文。我从 Twitter 中提取所有数据都很好,当我使用通用单元格(即高度 200,UITextView 高度为 180)时,所有数据都会进入并显示正常。但是,这显然看起来不太专业,我想将其更改为动态调整单元格的高度。

Interface Builder 中的 UI 如下所示(蓝色突出显示的是 UITextView):

谁能告诉我如何调整单元格和文本视图的大小以正确显示内容?在这一点上,我相当迷茫。

【问题讨论】:

  • 您使用自动布局还是 s&s?到目前为止你尝试过什么?

标签: ios objective-c twitter uitableview


【解决方案1】:

您可以尝试使用this method。它与您的问题 99% 相似。先尝试让它只对Label起作用,然后再添加其他的UIViews

这里有一些关于问题解决方案的想法。

我将从上面的链接中复制部分代码。

首先,我将讨论仅带有标签的简化表格单元格。在 Storyboard 中添加 4 个约束(尾随和前导、标签和父视图之间的顶部和底部间距)。

在这种情况下,单元格的高度应该如下:

内容视图高度 = 顶部约束 + 标签高度 + 底部 约束

- (void)configureCell:(CustomCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    cell.customLabel.text = self.tableData[indexPath.row];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [self.tableView dequeueReusableCellWithReuseIdentifier:@"custom_cell"]
    [self configureCell:cell atIndexPath:indexPath];
    // here is HUGE mistake in link above! Be careful!
    [cell setNeedsLayout];
    [cell layoutIfNeeded];

    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height + 1;
}

下面是代码的作用:

1. Configuring the content of the cell
2. Forcing a layout of the cell to apply constraints
3. Getting the height of the contentView, computed using Auto-Layout. We can’t directly call systemLayoutSizeFittingSize:UILayoutFittingCompressedSize: on the cell because the constraints we’ve set up are relative to the content view. Finally, we use UILayoutFittingCompressedSize to get the smallest size fitting the content.
4. Adding a bonus 1. We’ve computed the content view height but we actually need to return… the cell height here. And it’s 1 pixel higher, because of the separator, which height is 1 pt (0.5 for Retina screens on iOS 7, to be exact).

讨论这个解决方案 该解决方案涉及更多计算,然后询问[NSString -boundingRectWithSize:options:attributes:]。但在我看来,后一种方法可以让您将所有设计(约束、字体设置等)直接移到代码中,因为它只给您标签高度,而不是整个单元格。

假设您从顶部和底部有 10pt 的缩进。有了新的更新,您决定将其更改为 5。您必须更改代码,否则它不会反映更改。

当然,计算每个单元格的高度需要更多的计算。幸运的是,在 iOs7 中引入了新的 UITableView 委托方法:tableView:estimatedHeightForRowAtIndexPath:。它大大减少了计算并提高了性能。

我确实相信,你应该使用这篇文章中描述的方法(尽管事实上,iOs6 可能存在一些性能问题。我认为现在只有 5-10% 的 iOs6 用户并且正在减少。)

【讨论】:

  • 根据我的经验,使用systemLayoutSizeFittingSize: 通常性能不够或不够灵活,无法在一般应用程序中工作。如果您需要支持不使用 estimatedHeight 方法的旧版 iOS,则尤其如此。此外,在 Stack Overflow 上通常不鼓励仅链接的答案,因为该链接将来可能会出现 404,因此您可能希望至少使用链接方法的大纲来扩展您的答案,以防链接在未来出现故障。
  • @AaronBrager 是的,你是对的。在 7.0 下,如果没有估计高度,那么在大量行上的性能会出现一些问题。但是 afaik 约占所有用户的 10%。相反。使用 boundingRectWithSize 将使您的设计(我认为来自 IB)进入代码。应在代码中重复更改设计(字体大小、系列、间距等)。
  • 这些都是有效点,如果您想扩展它,我认为这会改善您的答案。
  • 同意 - 由于新的 UITableView 委托方法,此解决方案最适合 iOS 7.0 +。但是,您可以通过缓存计算的高度值来获得性能优势。请参阅此博客文章中的 Performance 部分,了解其他开发人员的经验:johnszumski.com/blog/…
  • 不得不修改一些东西,但绝对是一个可行的解决方案。谢谢!
【解决方案2】:

你只需要做两件事:

  1. 计算单元格的高度,并将其返回到tableView:heightForRowAtIndexPath:。 (您可以使用[NSString -boundingRectWithSize:options:attributes:] 来获取文本的大小。)是的,您需要做一些几何/加法。

  2. 将您的 UITextView 配置为自动扩展至其父视图中的适当填充空间。您可以使用自动布局、弹簧和支柱或手动布局来做到这一点。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多