滚动时如何使tableView单元格“粘”

Posted

技术标签:

【中文标题】滚动时如何使tableView单元格“粘”【英文标题】:How to make tableView cell "stick" while scrolling 【发布时间】:2018-08-03 21:44:42 【问题描述】:

我的 tableView 顶部的单元格上有一个 SegmentedControl(tableView 由所有静态单元格组成)...我希望顶部单元格(和 segmentedControl)“粘贴”,以便它始终作为用户可见滚动表格(见下面的截图)。这可能吗?

【问题讨论】:

您想将分段控件添加为表格视图的子视图。然后添加与段控件高度相同的表格视图标题或空单元格。 非常简单,只需将 segmentedControl 拖放到表格的标题视图中即可。 @aBilal17 它不会被“粘住”。 正确的方法是不使用 TableViewController,而是使用 UIViewController 和 tableView。然后将分段控件添加为常规视图,这样就不会受到滚动的影响。 【参考方案1】:

通常,要应用此行为,您应该将其添加为 标题视图 而不是单元格。表格视图中的标题视图确实“坚持”。但是由于您正在添加静态单元格(UITableViewController),因此即使您尝试将标题视图添加到表格视图,它也不会应用粘贴行为。

作为一种解决方法,您可能需要添加一个新的 UIViewController,其中包含顶部视图(标题视图)和容器视图,如下所示:

【讨论】:

谢谢它有点乱,因为 tableView 的视图依赖于 SegmentedControl 的值,即我必须做某种类型的协议/委托才能将消息从外部传递给 tableView风险投资。我会暂时开放一段时间,以确保在我标记为已接受之前没有其他方法。 ? @GarySabo 当然!希望有人提供更好的解决方案。【参考方案2】:

我想到的一个骇人听闻的解决方案是:

在您的 VC 中声明标题,或保留引用:

private var header: UIView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))

将其添加为tableView的子视图,并将内容插入设置为标题的高度。

tableView.addSubview(header)
tableView.contentInset.top = header.frame.height

如果您的标题使用自动布局,您需要调用 view.layoutIfNeeded()设置内容前插入

然后让 header 始终粘在 tableView 的顶部:

func scrollViewDidScroll(_ scrollView: UIScrollView) 
    header.frame.origin.y = scrollView.contentOffset.y

【讨论】:

以上是关于滚动时如何使tableView单元格“粘”的主要内容,如果未能解决你的问题,请参考以下文章

tvOS tableView 从一个单元格到另一个单元格平滑滚动

如何使用 UIImage 从 tableview 单元格中的 url 平滑滚动

swift - 快速滚动时如何阻止tableview单元格出现故障和闪烁的图像?

限制tableView中显示的单元格数量,滚动到最后一个单元格时加载更多单元格

如何阻止 UITableview 一次滚动多个单元格

如何将 TableView 单元格滚动到屏幕键盘之外?