2016-04-23 126 views
6

我有一个项目的动态列表,每个项目可以有不同的teamplate /布局(和高度)。其中一个项目类型可以有一个可供选择的内部项目列表,通常是5-6行,每个项目都有不同的高度。UITableView里面的动态细胞高度的UITableViewCell

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

enter image description here

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

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

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

Source code用附接(Xamarin.iOS)

+0

为什么你需要tableview里面的tableView? – iOSEnthusiatic

+0

我认为你正在寻找可选的func tableView(_ tableView:UITableView,heightForRowAtIndexPath indexPath:NSIndexPath) - > CGFloat' – user212514

+0

@iosenthusiatic它的设计要求,我有一个动态列表项目,每个项目可以有不同的布局(和高度)。其中一个项目可以选择内部项目列表,每个项目有5-6行,每个项目都有不同的高度。 –

回答

2

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

#master-cell像childViewController一样工作,它是#slave TableViewController的delegatedatasource。但是在UITableViewcell中你不能有一个childViewController。

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

真正的问题是#主单元的高度,

  1. 如果你的数据是简单,静态,你可以计算出提前的高度,并在视图控制器的方法func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat返回。
  2. 否则,加入#主细胞的方法,它返回的高度为整个小区时,其财产set.And创建一个代理#主单元来计算的高度,并将其返回:

    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; 
    }  
    

    这是复杂和昂贵的,但它的工作。

+0

它不能解决我的问题,但至少帮助我前进。在许多情况下,我没有#master-cell的高度问题。我使用自动布局,并且一旦知道所有内部元素的高度,就会自动很好地定义高度。这里的问题是我不知道我的内部表格视图的高度,因为它的动态内容。 –

+0

@AlexeyStrakh我知道这是一个旧帖子,但最终你是否设法解决这个问题?我有完全相同的问题,我无法找到任何信息在互联网上,我试过了我发现的一切,但仍然无法正常工作。 – Emil

+0

@Emil我用方法1来达到这个效果。在我的情况下,根据数据源只需要返回4个不同的单元高度。#从机表,不需要一次显示,否则,只能使用很多常见的视图。 – wj2061

1

对于这样的布局IOS一个测试项目中的tableview提供部,用于主项使用SectionView(存在用于sectionView委托方法 - >可以在其中用于提供图一节),因为不同部分可能有不同类型的行,所以根据需要制作行并根据章节返回它们。

+0

我有一个稍微不同的解决方案,因为其他细胞类型,我无法使用部分。 –

1

也许是因为我不知道你的项目背景或你想要完成什么,但tableVIew单元格内的tableViews听起来不必要的微不足道。而不是像#slave tableViews那样使用主表tableView,如前面的答案中所述,只需在单个tableView中按部分分割就可以了。有UITableViewDelegate方法旨在为您简化这个!

1

首先你必须得到字符串的身高那么高得给下面的tableView委托

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

} 

这是为我工作。

 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:当然

+0

内部表的问题是我无法获得内部字符串的高度,因为此刻我需要说主机单元的高度,我的从表没有绑定到数据。即使我将其绑定,我的内部单元格也不会创建,现在我需要计算高度 –

1

是,只要你想,例如检查这段代码,你可以有很多的原型细胞。

希望它有帮助。

1

如果您使用不同的章节和行使用以下格式,它的工作对我来说,

- (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; 
} 

希望它有帮助

+0

我的单元格高度无法预定义,而是基于从API返回的内容。 –

+0

其内容文字高度啊? –

+0

这是关于3-4自动布局的元素。我的变化高度的主要原因是在文本的其中一个元素,是的 –

2

我觉得你没有必要采取UITableViewUITableView的。您可以在UITableView以上选择多个部分。并使用不同的cellReuseIdentifier。这样你的目标就会实现。

0

我使用Xcode 8.3.2和Swift3.1。

我有同样的要求,已经尝试过所有,没有为我工作。

最后,UIStackView是为我工作的。

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

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

Add views in UIStackView programmatically