【问题标题】:UITableView inside UITableViewCell with dynamic cell height具有动态单元格高度的 UITableViewCell 内的 UITableView
【发布时间】:2016-08-16 19:42:03
【问题描述】:

我有一个动态的项目列表,每个项目可以有不同的团队板/布局(和高度)。其中一个项目类型可能有一个内部项目列表可供选择,通常有 5-6 行,每行都有不同的高度。

如果我尝试进一步描述它,在我的场景中,我在另一个 tableview (#master) 的 tableviewcells (#master-cell) 中有一个 tableview (#slave)。此外,我的#slave tableview 中的单元格(#slave-cell)也可能具有不同的高度。所以我需要布局我的#slave 让#master 自动计算并更新它的大小。

我遇到了内部表 (#slave) 的问题。在自动布局的情况下,为了适应所有单元格空间,表格将被折叠,不像 UILabel 或其他控件。所以我这里需要的是获取#slave表的投影大小并设置#slave的高度=#slave的内容高度。

我找到了similar post,如果所有行都具有相同的高度,它就可以工作,但我使用的是动态高度的自定义行,所以 tableView.contentSize.Height 给了我无效的结果(基本上只是乘以 rowNumbers *estimatedRowHeight,你可以看到它在屏幕截图上,主项目 #3 有 4 个内部单元格)。即使在调用 #slave.reloadData 之后,我也无法获得那个大小。

构建这种 UI 的正确方法是什么?

Source code 附带一个测试项目 (Xamarin.iOS)

【问题讨论】:

  • 为什么tableview里面需要tableView?
  • 我想你在找optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
  • @iOSEnthusiatic 这是设计要求,我有一个动态的项目列表,每个项目可以有不同的布局(和高度)。其中一个项目可能具有可供选择的内部项目列表,通常为 5-6 行,每行具有不同的高度。
  • 为什么需要多个表视图?你不能只使用section来划分你的tableView并插入不同高度的单元格(甚至使用UITableViewAutomaticDimension自动计算高度)吗?
  • @SanderSaelmans 你能否建议我如何在我的场景中使用部分。您是否建议为这个特定的数据项使用全新的部分,而不仅仅是单个单元格?

标签: ios uitableview xamarin xamarin.ios autolayout


【解决方案1】:

我正在使用 Xcode 8.3.2 和 Swift3.1。

我有同样的要求,已经尝试了所有,对我没有任何帮助。

最后,UIStackView 对我有用。

在 tableviewcell 中,我添加了一个 UIStackView(Verticle),继续向该 UIStackView 添加子单元格。它会自动增加单元格的高度。

检查以下以编程方式添加 UIStackView。

Add views in UIStackView programmatically

【讨论】:

  • 这行得通,但是你当然不会从它的委托方法中获得UITableView 功能,而我也希望获得它。
  • 我也有同样的期待,但不幸的是,目前还不可行。
【解决方案2】:

如果您使用不同的部分和行,请使用以下格式,它对我有用,

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0) {
        return 121;
    }
    if(indexPath.section==1)
    {
        return 81;
    }

    if (indexPath.section%2 == 0 && indexPath.row == 1) {
        return 161;
    }

    if (indexPath.section%2 != 0 && indexPath.row == 0) {
        return 81;
    }

    if (indexPath.section==16 && indexPath.row==0) {
        return 161;
    }
    else
    {
        return 44;
    }
}

我有模板代码,不同的部分和行,它的每一行都有不同的大小,所以我给出了这种类型的代码,如果你知道上面的代码那么它对你有帮助,

如果您使用以下代码更改内容文本大小的高度,它会计算内容大小然后更改高度(UILabel)大小,它对我有用

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ListModel *model = [ListArray objectAtIndex:indexPath.row];

    CGRect labelRect = [model.content boundingRectWithSize:CGSizeMake(tableView.frame.size.width - 90 - 15, 0)
                        options:NSStringDrawingUsesLineFragmentOrigin
                        attributes:@{
                                     NSFontAttributeName : [UIFont fontWithName:@"Arial" size:14.0]
                                     }
                        context:nil];

    CGFloat heightOfCell = labelRect.size.height + 60;

    if(heightOfCell > 106)
        return heightOfCell;

    return 106;
}

希望对你有帮助

【讨论】:

  • 我的单元格高度无法预定义,它基于从 API 返回的内容。
  • 它的内容基于文本的高度啊?
  • 大约 3-4 个带有自动布局的元素。我具有可变高度的主要原因是其中一个元素中的文本,是的
【解决方案3】:

几天前我遇到了同样的问题,并试图解决它。

#master-cell 像 childViewController 一样工作,它是 #slave TableViewController 的 delegate datasource。但是 UITableViewcell 中不能有 childViewController。

自定义 UITableViewCell 以保持必要的属性并充当#slave TableViewController 的delegatedatasource,并配置#slave-cell 的 高度和数据。

真正的问题是#master-cell 的高度,

  1. 如果你的数据是简单静态的,你可以提前计算高度,并在ViewController的func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat方法中返回。
  2. 否则,向#master-cell 添加一个方法,该方法在设置其属性时返回整个单元格的高度。并创建一个代理#master-cell 来计算高度并返回它:

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
      let cell   = CustomUITableViewCell();
      let model  = self.getModel(indexPath)
      cell.model = model
      let height = cell.requiredHeight()
      return height;
    }    
    

    它既复杂又昂贵,但很有效。

【讨论】:

  • 它没有解决我的问题,但至少帮助我前进。在可能的情况下,我对#master-cell 的高度没有问题。我正在使用自动布局,一旦我知道所有内部元素的高度,它就会很好地自动定义高度。这里的问题是我不知道我的内部表格视图的高度,因为它是动态内容。
  • @AlexeyStrakh 我知道这是一篇旧帖子,但你最终解决了这个问题吗?我遇到了完全相同的问题,我在互联网上找不到任何信息,我已经尝试了我找到的所有内容,但仍然无法正常工作。
  • @Emil 我是用方法1来达到效果的。就我而言,我只需要根据数据源返回4个不同的单元格高度。#slave-table,不需要一次全部显示,否则,你可以使用很多常见的视图。
  • @wj2061 感谢您的回复。我的问题是我的两个表视图都需要具有动态单元格大小,并且从表视图也不应该是可滚动的。 master-tableview 计算所有其他单元格的单元格大小没有任何问题,但是在计算包含从属表的单元格大小时失败。从表的高度 = 0。我什至尝试向从表添加 iboulet 约束并设置它,但没有
【解决方案4】:

我认为你不需要在UITableView 中使用UITableView。您可以在UITableView 中选择多个部分。并使用不同的cellReuseIdentifier。这样你的目标就会实现。

【讨论】:

    【解决方案5】:

    是的,当然,您可以拥有任意数量的原型单元,例如检查这段代码:

         override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            if indexPath.section == 0 {
    
            let cell =  tableView.dequeueReusableCellWithIdentifier("TodayWeatherCell", forIndexPath: indexPath) as! SITodayWeatherTableViewCell
    
            cell.setupCell(upCommingWeather)
            cell.aboutCityUpdateTableViewClousure = {
                self.tableView.reloadData()
            }
    
            return cell
        }else {
    
            let cell = tableView.dequeueReusableCellWithIdentifier("cityDetailCell", forIndexPath: indexPath) as! SICityDetailTableViewCell
            let detail = detailCity[indexPath.row]
            cell.setupCityDetail(detail)
    
            return cell
            // Configure the cell...
        }
      }
    

    一个 UITableView 中有两个不同的单元格。

    希望对你有帮助。

    【讨论】:

      【解决方案6】:

      首先你必须得到字符串的高度,然后高度必须在 tableView 委托下面给出

      -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      {
      return stringHeight;
      
      }
      

      它对我有用。

      【讨论】:

      • 内部表的问题是我无法获取内部字符串的高度,因为目前我需要说主机单元格的高度,我的从表未绑定到数据。即使我绑定它,我的内部单元格也不会在我需要计算高度的那一刻创建
      【解决方案7】:

      也许是因为我不知道您项目的背景或您要完成的工作,但 tableVIew 单元格内的 tableViews 听起来不必要地琐碎。与其将主 tableView 与#slave tableViews 一起使用,不如在前面的答案中所述的单个 tableView 中按部分分解内容会更干净。有 UITableViewDelegate 方法旨在为您简化此操作!

      【讨论】:

        【解决方案8】:

        对于这样的布局,ios在tableview中提供部分,对于主项目使用SectionView(sectionView有委托方法->您可以在其中为部分提供视图)并且不同的部分可能有不同类型的行,所以制作行根据您的需要并根据部分归还。

        【讨论】:

        • 我有一个稍微不同的解决方案,由于其他单元格类型,我无法使用部分。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2014-07-06
        相关资源
        最近更新 更多