在 UITableView 中,如何在隐藏行后关闭行的底部边框?

Posted

技术标签:

【中文标题】在 UITableView 中,如何在隐藏行后关闭行的底部边框?【英文标题】:In a UITableView, how do I close the bottom border of a row after hiding the row after it? 【发布时间】:2017-02-11 16:13:15 【问题描述】:

这就是我所说的“关闭底部边框”的意思:

第二行当前处于“隐藏”状态(其高度设置为 0)。当用户单击第一行时,会出现第二行(其高度已恢复)。如果有帮助,这里是隐藏和显示第二行的代码。

首先,我有一个成员变量,用于存储第二行是否打开(它是带有选择器视图的行):

var referenceLengthPickerIsOpen: Bool = false

以下是确定高度的方法:

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

    if indexPath.section == 0 && indexPath.row == 1 
        return referenceLengthPickerIsOpen ? 216.0 : 0.0
    

    return super.tableView(tableView, heightForRowAt: indexPath)

以下是用户单击第一行以显示或隐藏第二行时的处理代码:

override func tableView(_ tableView: UITableView,
           didSelectRowAt indexPath: IndexPath) 

    self.tableView.deselectRow(at: indexPath, animated: true)

    if indexPath.section == 0 && indexPath.row == 0 
        referenceLengthPickerIsOpen = !referenceLengthPickerIsOpen
        tableView.beginUpdates()
        tableView.endUpdates()
    

显示和隐藏部分效果很好,当第二行的高度从 0 变为 216 时,动画效果很好,反之亦然。

但是,在隐藏第二行之后,我留下了上图所示的边框间隙。我知道原因:底部边框只对最后一行关闭,目前是隐藏的。

我试图通过改变这样的行数来解决这个问题:

override func tableView(_ tableView: UITableView,
      numberOfRowsInSection section: Int) -> Int 

    if section == 0 
        return referenceLengthPickerIsOpen ? 2 : 1;
    

    return super.tableView(tableView, numberOfRowsInSection: section)

但这只会在我点击第一行时让我的应用崩溃。

【问题讨论】:

我相信底部边框可能是UITableView分隔线。如果不是,请告诉我。 这一行referenceLengthPickerIsOpen ? 2 : 1 应该可以正常工作。你能把崩溃报告给我看一下吗? 【参考方案1】:

转到情节提要,选择单元格转到分隔符,自定义插入并将其设为0。下面是图像。

更新:

【讨论】:

谢谢。但是每个部分的页脚边距也变为零,这使得文本正好靠在视图的左边缘。 在我的示例中,我不会发布另一张图片。 有趣。我想知道为什么我的页脚的边距会随着插图的变化而变化。无论如何,设置表格视图的插图的问题在于它会影响所有行。我实际上希望行有一个插入,除非下一行被隐藏(使上一行成为最后一行,所以它应该有一个完整的底部边框)。 如果tableView是静态的,不要在tableview自定义插入中做,对tableViewCell做。我将添加另一张图片向您展示另一个示例 谢谢,成功了。因为我确实想要在显示第二行时插入,所以我动态地将插入更改回显示第二行时的状态,并在隐藏时返回 .zero。【参考方案2】:

我相信底部边框可能是UITableView的默认分隔线。如果这是真的,将UITableViewseparatorInset 设置为0 应该可以解决问题

您可以通过以下方式进行。

self.tableView.separatorInset = UIEdgeInsets.zero

上面的代码关闭了底部边框。

您可以通过隐藏分隔符来隐藏底部边框。

self.tableView.separatorColor = UIColor.clear

如果它解决了问题,请告诉我。

【讨论】:

谢谢。它几乎可以工作。我在viewDidLoad() 方法中将separatorInset 设置为零,但这也会导致页脚左边距为零,因此文本正好靠在左边缘。

以上是关于在 UITableView 中,如何在隐藏行后关闭行的底部边框?的主要内容,如果未能解决你的问题,请参考以下文章

添加行后如何更新 UITableView?

在 UITableView 中插入一些行后,它在 ios 7 中没有滚动

Iphone:UITableView 标题行在 6 行后重复

隐藏或删除行后如何更新 HTML 表中的行索引?

取消选择数据表行后如何正确删除数组中的索引或值?

Swift 中的 UITableView 无法识别 UINavigationBar,填充已关闭,部分 tableview 被隐藏