动态表格视图单元格,以编程方式更改子视图高度

Posted

技术标签:

【中文标题】动态表格视图单元格,以编程方式更改子视图高度【英文标题】:Dynamic table view cell, change of subview height programmatically 【发布时间】:2015-09-17 04:40:24 【问题描述】:

我有一个带有自定义视图单元格的UITableViewCell。 在这个视图单元格中,我有一个名为 imgWrapper 的简单 UIView,我在其中添加了如下约束:

宽度 = 50 高度 = 50 导致superview = 20 top to superview = 20 从底部到超级视图 = 20

这些是那里唯一的限制。我把拥抱和压缩留给了默认的。

在我的代码中我设置了这个:

  override func viewDidLoad() 
        super.viewDidLoad()

        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.estimatedRowHeight = 90

然后在我的 rowAtIndex...我有这个:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell: LogCustomCell = tableView.dequeueReusableCellWithIdentifier("logCustomCell", forIndexPath: indexPath) as! LogCustomCell

     var imgWrapperHeight: CGFloat = log.big ? 100 : 50

     cell.imgWrapperHeight.frame.size.height = imgWrapperHeight 
     return cell

一旦我编译并运行它。所有单元格的大小都相同。

注意事项:

我检查了 log.big 是否为真/假,并且确实发生了变化。 我也尝试过CGRect(x,y,width,height),但也没有成功。 我知道我可以做heightForRowAtIndexPath,但我想做动画,我知道我们可以为标签做这样的事情(见打印屏幕),这使得 tableView 知道高度而不定义它:

知道我做错了什么吗?

【问题讨论】:

您必须删除高度约束或底部以查看约束,因为您的约束存在问题 【参考方案1】:

您需要将您的身高逻辑放入名为tableView:heightForRowAtIndexPathUITableViewDelegate 方法中,如下所示:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    return (true ? 100 : 50) + 2 * 20

PS。我在 Swift 2 中编写了这个,因此是 overridekeyword。

【讨论】:

当你这样做时,我认为自动布局取代了这个:self.tableView.rowHeight = UITableViewAutomaticDimension 你的imgWrapperHeight在单元格中是什么类型的?根据名称,我猜它是NSLayoutConstraint,但它没有名为frame 的属性。所以我猜这是UIView?你想实现什么样的动画?没有单元格开始,然后它们都以各自的高度从顶部开始动画?【参考方案2】:

委托方法“heightForRowAtIndexPath”将为您完成。您可以知道要从 indexPath.row 中返回高度的单元格索引,从而相应地返回高度。

if indexPath.row == 0

  return 70

else if indexPath.row == 1

  return 100

【讨论】:

当你这样做时,我认为自动布局取代了这个:self.tableView.rowHeight = UITableViewAutomaticDimension【参考方案3】:

添加

self.automaticallyAdjustsScrollViewInsets = false

这两行之前

tableView.estimatedRowHeight = 50
tableView.cellHeight = UITableViewCellAutomaticDimension

【讨论】:

【参考方案4】:

解决方案 1:

正如用户所说。您可以像这样在 UITableViewController 中设置行高:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    return (true ? 100 : 50) + 2 * 20

解决方案 2:

在将确定单元格高度的元素上设置height 约束。然后在你的 VC 中为NSLayoutConstraint 创建一个出口 在设置单元格的内容时,您可以执行以下操作:

例如: @IBOutlet var imgWrapperHeightConstraint: NSLayoutConstraint!

...

override func tableView(tableView: UITableView, cellAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    imgWrapperHeightConstraint.constant = 50 // Or whatever value you want

【讨论】:

以上是关于动态表格视图单元格,以编程方式更改子视图高度的主要内容,如果未能解决你的问题,请参考以下文章

如何动态更改自定义单元格的表格视图单元格的高度?

动态更改静态表格视图单元格高度

动态更改表格视图单元格的高度

动态表格视图单元格高度

动画在具有动态单元格高度的单元格中添加子视图

将动态单元格的表视图内容高度设置为表视图高度约束 ios