如何在 iOS 中创建具有动态 tableview 高度的动态 tableview 单元格

Posted

技术标签:

【中文标题】如何在 iOS 中创建具有动态 tableview 高度的动态 tableview 单元格【英文标题】:How to create dynamic tableview cell with dynamic tableview height in iOS 【发布时间】:2016-03-04 03:59:39 【问题描述】:

我想根据内容增加表格视图单元格和表格视图高度。 假设 tableview 包含 2 条记录,他的第一个单元格高度是 100,第二个单元格高度是 25,那么 tableview 高度应该是 100+25=125。 如何实现这个功能?

提前致谢。

【问题讨论】:

您的主要目标是什么,您想根据所有单元格的高度计算表格的高度,或者您只想创建具有不同高度单元格的表格? 我只想根据标签内容创建单元格高度和基于单元格高度的表格视图高度,这两者。 使用自动布局***.com/questions/18746929/… 首先你应该得到自定义tableView单元格中的单元格。然后根据内容设置单元格高度。主要在这里你需要设置标签的高度和宽度。 对了,为什么要根据单元格高度来设置表格高度?它将在两个方向上滚动。请进一步解释。 【参考方案1】:

你绝对可以做到的,

    首先确保您的单元格子视图约束必须设置为从上到下才能计算单元格所需的高度。

    确保您的委托设置如下

    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
          return 44;
     
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
        return UITableViewAutomaticDimension;
    
    

    设置你的 tableView 的高度约束并消除该约束。

    将以下方法添加到您想要动态调整 tableView 大小的类中。

    - (void)adjustHeightOfTableview
    
    
        CGFloat height = self.tableView.contentSize.height;
       //CGFloat maxHeight = self.tableView.superview.frame.size.height - self.tableView.frame.origin.y;
    
       /* 
         Here you have to take care of two things, if there is only    tableView on the screen then you have to see is your tableView going below screen using maxHeight and your screen height,
         Or you can add your tableView inside scrollView so that your tableView can increase its height as much it requires based on the number of cell (with different height based on content) it has to display.
      */
    
      // now set the height constraint accordingly
      self.constraintHeightTableView.constant = height;
    
     //If you want to increase tableView height with animation you can do that as below.
    
     [UIView animateWithDuration:0.5 animations:^
           [self.view layoutIfNeeded];
     ];
    
    

    当你准备好表的dataSource时调用这个方法,并调用该方法

    dispatch_async(dispatch_get_main_queue(), ^
    
        [self.tableView reloadData];
    
        //In my case i had to call this method after some delay, because (i think) it will allow tableView to reload completely and then calculate the height required for itself. (This might be a workaround, but it worked for me)
        [self performSelector:@selector(adjustHeightOfTableview) withObject:nil afterDelay:0.3];
    );
    

【讨论】:

【参考方案2】:

如果您运行的是 ios 8+, 您可以使用:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 80 // your desired or expected height

属性。

    要使此功能生效,您不应在 heightForRowAtIndexpath 中设置任何高度 您应该设置单元格约束,即单元格内存在的元素的约束,因此设置的约束足以让 tableviewcell 在运行时计算其高度

【讨论】:

【参考方案3】:

swift 3 中的解决方案

第 1 步。 设置顶部、底部、前导和尾随约束(不要使其恒定高度,但要设置恒定高度约束)。 现在我们要根据单元格的数量和高度动态地改变这个高度。

第 2 步。 将该高度约束的出口拖到类中,并将此函数复制到类中的任何位置。

    func adjustHeightOfTableview() 
    let height: CGFloat = tableview.contentSize.height
    self.outLetOfTheHeightConstraint.constant = height


第 3 步。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    DispatchQueue.main.async 
            self.tableview.reloadData()
            self.perform(#selector(self.adjustHeightOfTableview))
        

【讨论】:

【参考方案4】:
self.tableView.frame = CGRectMake(self.tableView.origin.x, self.tableView.origin.y, self.tableView.frame.size.width, 125);

【讨论】:

我只是解释一下我到底想要什么,我不能设置像 125 这样的静态高度。 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 +1 为 Jan Greve 。我在您解释后回答了您的问题:) 所以如果您找不到解决方案,请分享您的联系方式

以上是关于如何在 iOS 中创建具有动态 tableview 高度的动态 tableview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios中创建没有tableview和collection view的行

如何在 iOS 中创建具有动态内容的视图?

如何在 swift 中在动态 TableView 中创建动态 tableView?

如何在tableView swift的Xib Cell中创建内部视图动态

如何在 tableview 中创建一个具有多个字段的单元格?

如何在单个 tableView 中创建各种类型的单元格?