您可以更改不同表格视图单元格的分隔符宽度吗?

Posted

技术标签:

【中文标题】您可以更改不同表格视图单元格的分隔符宽度吗?【英文标题】:Can you change separator width for different tableview cells? 【发布时间】:2020-03-10 16:00:06 【问题描述】:

如果之前有人问过这个问题或者答案很明显,我提前道歉——我只是很难找到这个问题的好答案。

表格视图中的不同单元格是否可以有不同的分隔符宽度? 我想让前几个单元格的分隔符宽度较短,最后一个单元格让顶部和底部分隔符边到边。

示例图片:

我可以通过在情节提要中将分隔符样式设置为“无”来伪造所需的外观,然后在每个单元格中添加一个浅灰色 UIView 作为分隔符(在 cellForRow 方法内)。但是,如果可能的话,我想避免这种情况。

有没有更好的方法来更改不同单元格的分隔符宽度? 注意:我使用的是 Swift

【问题讨论】:

您是否尝试过使用cell.separatorInset?执行此操作的最佳位置可能是在 willDisplayCell 方法内,并根据需要为特定的 indexPath.row 设置插图。 【参考方案1】:

您可以使用cell.separatorInset 更改分隔符的尺寸。

例如,这为前三个单元格绘制了一个较短的分隔符:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    if indexPath.row < 3 
        cell.separatorInset = UIEdgeInsetsMake(0, 30, 0, 11) // shorter separator
    else 
        cell.separatorInset = UIEdgeInsetsMake(0, 3, 0, 11) // longer separator
    

来自willDisplayCell 文档:

表格视图在使用单元格绘制行之前将此消息发送给其委托人,从而允许委托人在单元格对象显示之前对其进行自定义。此方法使委托有机会覆盖先前由表视图设置的基于状态的属性,例如选择和背景颜色。代理返回后,表格视图仅设置 alpha 和 frame 属性,然后仅在行滑入或滑出时设置动画。

【讨论】:

非常感谢科恩!您的解决方案完美运行。请问——您更喜欢将其放在 willDisplay 单元格而不是 cellForRow 中的原因是什么?【参考方案2】:

对我来说,我使用了一个自定义单元格,分隔线占据整个宽度,但我想要默认样式,较短的样式,其中分隔线不显示在单元格图标图像下。我希望它始终与我的单元格标签领先位置保持一致,例如 iPhone 的设置。

我在 tableView 单元格文件中编写了以下代码以实现该效果。

    override func layoutSubviews() 
        super.layoutSubviews()
        
        let g = contentView
        NSLayoutConstraint.activate([
            iconContainer.centerYAnchor.constraint(equalTo: g.centerYAnchor),
            iconContainer.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20),
            iconContainer.widthAnchor.constraint(equalTo: g.heightAnchor, constant: -12),
            iconContainer.heightAnchor.constraint(equalTo: iconContainer.widthAnchor),
            
            iconImageView.centerXAnchor.constraint(equalTo: iconContainer.centerXAnchor),
            iconImageView.centerYAnchor.constraint(equalTo: iconContainer.centerYAnchor),
            iconImageView.widthAnchor.constraint(equalTo: iconContainer.widthAnchor, constant: -10),
            iconImageView.heightAnchor.constraint(equalTo: iconImageView.widthAnchor),
            
            label.leadingAnchor.constraint(equalTo: iconContainer.trailingAnchor, constant: 20),
            label.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20),
            label.centerYAnchor.constraint(equalTo: g.centerYAnchor)
        ])
        separatorInset = UIEdgeInsets(top: 0,
                                      left: 40 + iconContainer.frame.size.width,
                                      bottom: 0,
                                      right: 0)
    

【讨论】:

以上是关于您可以更改不同表格视图单元格的分隔符宽度吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有静态单元格的 UITableView - 每个部分的分隔颜色不同?

如何根据标签文本快速更改表格视图单元格高度?

如何更改分组的表格视图单元格的背景?

不同笔尖的collectionView单元格宽度不会改变

我可以使用 CSS 覆盖表格单元格的宽度吗?

如何像这样创建 iOS 表格视图?