2

我有一个自定义表格单元格,其中包含 3 个标签、一个按钮和一个 UITextView。

UITextView 的文本仅在运行时知道,因为它是我从服务器中提取的数据。

我正在尝试根据我放入 UITextView 的文本将我的 UITextView 和我的自定义表格单元格调整为正确的高度。

UITextView 的文本在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中设置。

在这里,我尝试使用以下方法调整 UITextView (bodyTextView) 的大小。

CGSize stringSize = [cell.bodyTextView.text sizeWithFont:cell.bodyTextView.font constrainedToSize:CGSizeMake(cell.bodyTextView.bounds.size.width, 9999) lineBreakMode:NSLineBreakByWordWrapping];

[cell.bodyTextView setText:threadMessage.body];

CGRect bodyFrame = cell.bodyTextView.frame;

bodyFrame.size = cell.bodyTextView.contentSize;

[cell.bodyTextView setFrame:bodyFrame];

这或多或少似乎工作正常,因为我的 UIButton 没有向下移动到它应该移动的位置,即使它在我的 UITextView 底部有一个“Top Space To”约束。我原以为它会自动移动。但是,我可以通过编程将其移动到适当的位置,所以没什么大不了的。

下一段代码确实将 tableViewCell 调整为适当的高度以适合标签和 UITextView,但底部的按钮没有足够的空间。接下来我计算单元格的高度并使用以下命令返回它......

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath
{
    CGSize stringSize = [threadMessage.body sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280, 9999) lineBreakMode:NSLineBreakByWordWrapping];

    float oldHeight = 28;
    float newHeight = stringSize.height;

    return tableView.rowHeight - oldHeight + newHeight;
}

正如你所看到的,我在 UITextView 高度和新高度之间做了一个高度差。我试图以编程方式获取 oldHeight,但我得到了成千上万的疯狂值。

最大的问题是,当视图首次显示时,行的大小或多或少是正确的。但是 UITextView 没有大小。如果我滚动以将其移出屏幕然后再滚动回来,则 UITextView 的大小正确。但是,如果我再次滚动它并返回屏幕,它会再次将自身调整为单行。

我觉得我有鸡或蛋的事情,无法解决这个问题。

我希望弄清楚的两个主要问题是:

1 ) 如何让 UITextView 从一开始就正确调整大小并保持这种状态,而不管屏幕是否滚动?

2 ) 如何让我的自定义 TableCellView 调整大小以包含按钮的高度?

我希望这一切都有意义,并且我已经提供了足够的细节。让我知道任何问题。

任何建议将不胜感激。谢谢!

问候,

彼得

4

3 回答 3

1

好的,我终于弄清楚了问题所在。以为我会发布我的解决方案,以防其他人遇到这个问题,因为今天这让我的大脑扭曲了好几个小时。

我认为这个问题可能与我使用 iOS 6 SDK 的项目有关。我下载了 iOS 5 Simulator 并尝试在上面运行我的应用程序。启动后立即出现错误。NSLayoutInconsitencyException (或类似的东西)。在进行了一些在线搜索后,我发现 iOS 5 与 iOS 6 的设置不兼容。

这个设置是“用户自动布局”,它在我的故事板文件中被选中。要找到它,请选择您的故事板文件,然后选择右侧的文件检查器 (Command-Option-1)。在 Interface Builder Document 部分下,您将看到“使用自动布局”复选框。取消选中此项,事情开始变得更好。每次在屏幕上下滚动单元格时,我的 UITextView 不再被调整为一行并恢复为全长。

但是我仍然有一个问题,即单元格的高度不正确。既然我已经解决了 Autolayout 问题,这变得非常简单(你不会相信我随处可见的所有已注释掉的试验和错误测试代码 :))。

在 cellforRowAtIndexPath 函数中,您需要将 UITextView 的文本设置为您想要的任何内容,然后简单地获取它的 contentSize,然后调整 UITextView 的框架...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];

    [cell.bodyTextView setText:myText];

    CGRect bodyFrame = cell.bodyTextView.frame;
    bodyFrame.size = cell.bodyTextView.contentSize;
    [cell.bodyTextView setFrame:bodyFrame];

    ... Whatever else you need to do here ...
}

然后在 heightForRowAtIndexPath 我发现再次获取一个单元格并设置文本我能够获得正确的大小差异,因此返回正确的大小。通过使用大小差异,它允许您在表格单元格中使用任何其他 UI 元素。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"]; 

    float oldHeight = cell.bodyTextView.frame.size.height;

    cell.bodyTextView.text = threadMessage.body;

    CGRect bodyFrame = cell.bodyTextView.frame;
    bodyFrame.size = cell.bodyTextView.contentSize;

    float newHeight = cell.bodyTextView.contentSize.height;

    return tableView.rowHeight - oldHeight + newHeight;
}

我希望这对将来的某人有所帮助。如果其中任何一个没有意义,请随时问我任何问题。感谢 Mohit 试图帮助我。非常感激。

于 2012-11-23T10:18:59.937 回答
0

在旋转时自动调整自定义单元格时,我也遇到了同样的问题。战斗后我得到了授权cell.contentView的解决方案,因为我将我的视图作为子视图添加到cell.contentview中。

我使用了以下代码,我的代码工作正常:)

cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
于 2013-07-02T05:56:10.783 回答
0

Etep,试试这个......首先你关闭单元格和按钮的调整大小/方向属性,然后你可以根据到达的文本制作适当的文本视图尺寸,以便你在哪里计算行高,而不是使用获取文本大小,你需要什么来获得文本视图的正确高度......并且休息很好。(在'cellForRowAtIndexPath'中,你应该使用可重复使用的单元格,或者说把你的代码在 if (cell==nil){})

于 2012-11-23T07:20:00.883 回答