如何根据UITextView的内容调整UITextView和UITableViewCell的大小

时间:2014-02-26 22:05:18

标签: ios objective-c twitter uitableview

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

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

Interface Builder中的UI如下所示(蓝色突出显示为UITextView):Cell's UI

有人能告诉我如何调整单元格和文本视图的大小以便正确显示内容吗?我在这一点上相当失落。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用this method。它与你的问题有99%的相似之处。首先尝试使其仅适用于Label,然后添加其他UIViews

以下是关于问题解决方案的一些想法。

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

首先,我将仅使用Label来谈论简化的表格单元格。在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用户并且正在减少。)

答案 1 :(得分:0)

你只需要做两件事:

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

  2. 将您的UITextView配置为在其超级视图中自动扩展到适当的填充空间。您可以使用自动布局,弹簧和支柱或手动布局来完成此操作。