2016-04-23 125 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