ios - 在该单元格中调整自定义 UITableViewCell 高度和 UITextView 的高度(存在其他 UI 元素)

标签 ios dynamic uitableview height uitextview

我有一个包含 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 的底部有一个“顶部空间到”约束。我本以为它会自动移动。但是我可以通过编程将其移动到适当的位置,所以没什么大不了的。

下一段代码确实将 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,但我得到了数以千计的疯狂值。

最大的问题是,当 View 首次显示时,行的大小或多或少是正确的。但是 UITextView 没有调整大小。如果我滚动将其移出屏幕然后将其滚动回来,则 UITextView 的大小合适。但是话又说回来,如果我将它滚动并返回到屏幕上,它会再次调整自己的大小为一行。

我觉得我遇到了先有鸡还是先有蛋的问题,无法解决这个问题。

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

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

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

如有任何建议,我们将不胜感激。谢谢!

问候,

彼得

最佳答案

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

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

此设置是“用户自动布局”,并且已在我的 Storyboard 文件中进行了检查。要找到它,请选择您的 Storyboard文件,然后选择右侧的文件检查器 (Command-Option-1)。在 Interface Builder Document 部分下,您将看到“Use Autolayout”复选框。取消选中此项,事情开始变得更好。每次我在屏幕上和屏幕外滚动单元格时,我的 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 试图帮助我。非常感谢。

关于ios - 在该单元格中调整自定义 UITableViewCell 高度和 UITextView 的高度(存在其他 UI 元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523742/

相关文章:

ios - 在 obj C/ios 中声明已知自定义类类型的数组

ios - 如何在单元格中按下按钮时将数据从一个 Tableview 传递到另一个 Tableview?

Swift-如何设置 TableView 分隔符边到边插入并具有布局边距

c - 指针运行时错误

objective-c - UITableViewCell 选择突出显示颜色

ios - Swift:NSTimer 内存泄漏

ios - 如何使对象可拖动?

ios - NSPredicate 嵌套字典动态键

c++ - 针对某些脚本语法中描述的问题,在 C++ 中实现求解器

java - 如何从我自己的自定义类加载器访问静态成员?