动态UITableViewCell不根据内容调整大小

时间:2016-12-27 11:16:12

标签: ios swift uitableview

enter image description here

Senario A: 如果我在cellForRowAtIndexPath中设置标签内容,则正确调整单元格的大小。

Senario B: 如果我在单元格中更改自定义操作中的文本内容,则单元格大小不会更改。(我确实调用setNeedsLayout + layoutIfNeeded)

如何解决这个问题?

编辑:

1)我已经设定, myTableView.estimatedRowHeight = 71.0 myTableView.rowHeight = UITableViewAutomaticDimension

2)我已正确添加了自动布局约束。

8 个答案:

答案 0 :(得分:5)

我遇到了这个问题,我的问题是我将内容限制在selfUITableViewCell)而不是self.contentViewcontentView OF细胞)。希望这可以帮助那些已经用代码构建其单元格的其他人!

答案 1 :(得分:4)

更改单元格的文本后,只需重新加载该特定单元格或只需调用mainTableView.reloadData()

重新加载该单元格 -

//indexPath is indexPath of cell you just changed label of
mainTableView.reloadRows(at: indexPath, with: .automatic)

答案 2 :(得分:3)

就我而言,单元格的自定义尺寸已启用:

enter image description here

答案 3 :(得分:1)

首先,我并不明确知道你对UITableViewCell的行动是什么。所以,我假设我在UITableViewCell选择中这样做。

  

以下答案仅适用于iOS 9及以上版本

但是,出于某种原因,它无法在 iOS 8 中进行,直到滚动。所以,我将更新iOS 8的答案。

我看到您在项目中使用了UITableView' estimatedRowHeightrowHeight。所以,

  

请检查以下

  1. 确保UITableView estimatedRowHeightrowHeight包含在viewDidLoad()
  2. 确保您的UILabel行设置为0
  3. enter image description here

    1. 确保您的UILabel没有关于身高的限制,并让限制符合
    2. enter image description here

      如果还包含其他组件,请确保仅包含底部和顶部空间限制或顶部空间到容器边距和底部空间到容器边距。

      1. 每次要更新单元格时,无论当前情况如何,都必须重新加载tableView。
      2. 所以,在您尝试此示例项目之前,还没有说什么,@Rikh回答仍然有效。可能是你走错了方向。这是解决方案。请按照我说的步骤进行操作,如果没有成功,请告诉我。您可能需要共享导致的示例项目。

        enter image description here

        示例演示 - DynamicCellDemo

          

        iOS 8更新:为iOS 8用户更新以下代码

        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            if #available(iOS 9, *) {
                // do nothing
            } else {
                tblDynamic.reloadData()
            }
        }
        

答案 4 :(得分:1)

在我的情况下,在同一单元格中,我在左上角有一个imageView,带有“容器中垂直居中”约束和一个“顶部空间容器”约束。

显然,要满足这两个约束,单元格的高度必须等于:

(imageView的高度/ 2)+(顶部空间容器约束的长度)。

这个高度不足以容纳标签文本,因此我的标签只有1行可见。

在删除imageView顶部约束后,所有约束都移到了正确的位置,在我的情况下,我希望图像居中,如果图像必须留在左上角,则必须取下“垂直居中”。容器”约束。

我希望这可以帮助某人。

答案 5 :(得分:0)

您可以做的是为来自顶部,底部,前导和尾随的所有边的单元格中的标签设置AutoLayout约束。然后将以下UITableViewDelegate方法添加到您的类中。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return 500
}

这将完成这项工作。现在,表视图单元格中的内容会自动调整单元格的高度。

答案 6 :(得分:0)

尝试使用此功能:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

     return UITableViewAutomaticDimension

}

 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {

    return UITableViewAutomaticDimension

}

答案 7 :(得分:-2)

在viewDidLoad()

中添加以下内容
-(void)viewDidLoad{
   [super viewDidLoad];
   tableView.rowHeight = UITableViewAutomaticDimension
   tableView.estimatedRowHeight = 140
}