向 uitableview 添加分隔符会导致布局约束错误

Posted

技术标签:

【中文标题】向 uitableview 添加分隔符会导致布局约束错误【英文标题】:Adding a seperator to the tableview causes a layoutconstraint error 【发布时间】:2019-09-24 11:55:20 【问题描述】:

我遇到了在 UITableViewController 中显示简单单元格的问题。 我的单元格只包含一个 UIImage。图像的顶部、前导和底部空间为 20。图像的高度和宽度为 60。

我不断收到以下 NSLayoutConstraint 问题。

"<NSLayoutConstraint:0x600001d6e030 UIImageView:0x7f8a37c218c0.height == 60   (active)>",
"<NSLayoutConstraint:0x600001d6d9a0 V:|-(20)-[UIImageView:0x7f8a37c218c0]   (active, names: '|':UITableViewCellContentView:0x7f8a37c1bb70 )>",
"<NSLayoutConstraint:0x600001d6c280 V:[UIImageView:0x7f8a37c218c0]-(20)-|   (active, names: '|':UITableViewCellContentView:0x7f8a37c1bb70 )>",
"<NSLayoutConstraint:0x600001d6f430 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7f8a37c1bb70.height == 100.333   (active)>"

我自己没有添加最后一个。它可能会自动生成整个视图的高度。

过了一会我发现删除tableview的分隔符确保没有冲突了

self.tableView.separatorStyle = .singleLine

我不想使用自定义 UIView 作为分隔符,我该如何解决这个问题。该应用程序正在打破图像的高度限制,这实际上并不是什么大问题。因为图像现在将是 60.333,但我想知道出了什么问题。

我已经尝试添加 automaticDimention 和estimatedRowHeight 没有成功

将 separatorStyle 设置为 none,将修复错误。但是应该有一个更聪明的解决方案。

【问题讨论】:

您可以使用 heightForRowAt 方法为单元格添加高度吗?? 将您的高度限制设置为 999 的优先级 设置优先级确实可以消除错误,我想我现在将使用该解决方案。谢谢 【参考方案1】:

图像的顶部、前导和底部空间为 20。图像的高度和宽度为 20。

这就是问题所在。无需在高度旁边设置顶部和底部

这可以通过使用来解决

保持高度宽度固定

去掉顶部和底部

使 ImageView 的 CenterY 和 Cell 的 CenterY 相等


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 60 // top 20 + imageView 20 + bottom 20 
    

或者

保留顶部和底部约束并移除高度,仅保留宽度

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
       return 60 // top 20 + imageView 20 + bottom 20 

【讨论】:

我认为它也必须在不设置 heightForRow 方法的情况下工作。我的问题是,当没有分隔符时,如果没有这种方法,它就可以完美地工作。但是添加分隔符,我收到一个错误。

以上是关于向 uitableview 添加分隔符会导致布局约束错误的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableView 约束到其父视图的边缘会导致布局冲突

向静态 UITableView 添加行:获取 NSRangeException

向 UITableViewCells 添加子视图会导致滚动时出现问题

如何向 UITableViewCell 添加自定义分隔符?

使用自动布局将子视图添加到 UITableView 不会设置其框架

单元格中的 UITableView 动画导致平滑滚动中断