【问题标题】:Resizing Custom UITableViewCell Height and Height of UITextView in that Cell (with other UI elements present)调整该单元格中的自定义 UITableViewCell 高度和 UITextView 的高度(存在其他 UI 元素)
【发布时间】:2012-11-11 12:04:52
【问题描述】:

我有一个自定义表格单元格,其中包含 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,但我得到了成千上万的疯狂值。

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

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

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

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

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

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

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

问候,

彼得

【问题讨论】:

    标签: ios dynamic uitableview height uitextview


    【解决方案1】:

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

    我使用了以下代码,我的代码运行良好:)

    cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
    

    【讨论】:

      【解决方案2】:

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

      我认为这个问题可能与我使用 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 试图帮助我。非常感谢。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 感谢莫希特的回复!我正在使用 dequeueReusableCellWithIdentifier 重用单元格,只是没有放在上面的代码中。 :) 至于其余的,我承认我不确定我是否遵循?我不确定单元格和按钮的调整大小/方向属性是什么意思?你的意思是关掉吗?如何?您还提到,我应该获取 textView 的高度,而不是获取文本大小(这是正常工作的一件事)?我假设使用 frame.size.height?我试过了,但文本还没有写入文本视图,因为 heightForRoawAtIndexPath 在 cellForRowAtIndexPath 之前被调用。
        • 当我发现您的按钮位置错误时,唯一可能发生的情况是您的单元格会自动调整子视图的大小,因此只需从 IB 中取消选中该属性,并检查您所在的窗口选项组件将被看到,最重要的是您的行高应该根据 textview 而变化,而不是像您使用的那样,因为它们永远不会相等。此外,您可以知道您的文本字段何时填充了您的数据,之后只是显式调用 heightForRowAtIndexPath。
        • 您能否提供您从中获取数据的网址,以便我制作样本并据此告诉您:)
        • 我刚刚用一些假数据进行了测试,首先我假设我的 textView 大小达到了某个最大限制,比如屏幕的一半并开始该过程,当我下载完成时,我检查了数组中的数据然后我用正确的计算重新加载表......
        • 好吧,我发现了一个主要问题。我使用的是 iOS 6 SDK,并且情节提要已选中“使用自动布局”。我取消选中了这个(也去了 Simulator 5.0),这解决了 UITextView 在滚动表格视图时改变大小的问题。现在我只需要得到正确的行高。如果它们是少量数据,则高度会略微降低,但随着文本的增加而增加。我上面的代码缩短了行的高度,文本视图中的文本越多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 2017-07-24
        • 2016-06-23
        • 2018-06-28
        相关资源
        最近更新 更多