gpt4 book ai didi

swift - 如何让 UITableView 的固定标题在滚动后隐藏

转载 作者:行者123 更新时间:2023-11-30 12:43:15 27 4
gpt4 key购买 nike

我希望当用户通过固定到顶部滚动时使我的 tableViewHeaders 可见,这是我的 tableView 中的当前行为。但是,当 tableView 停止滚动时,我想删除这些“固定”标题。我在我的collectionView项目中使用scrollView委托(delegate)方法中的以下方法实现了这一点:

if let cvl = chatCollectionView.collectionViewLayout as? UICollectionViewFlowLayout {
cvl.sectionHeadersPinToVisibleBounds = false
cvl.invalidateLayout()
}

是否有类似的方法来隐藏 tableView 的“固定”(粘性)标题?我正在使用 tableViewController。

最佳答案

这是我对这个问题的解决方案。我想知道是否有更简单的方法来做到这一点。

请注意,只有当您的 header 是 UITableViewHeaderFooterView 时,这才有效。如果您使用 UITableViewCell 作为标题,则不会。如果您使用的是 UITableViewCell,则 tableView.headerView(forSection: indexPathForVisibleRow.section) 将返回 nil。

为了在 tableView 停止滚动时隐藏固定标题并在 tableView 再次开始滚动时重新显示它们,请重写这四个 scrollView 委托(delegate)方法。

在前两个(scrollViewWillBeginDragging 和scrollViewWillBeginDecelerating)中,获取可见行的第一部分的节标题并确保它没有隐藏。

在后两个委托(delegate)方法中,检查每个可见行的标题框架是否与行单元格的框架重叠。如果是,那么这是一个固定的 header ,我们会在延迟后将其隐藏。我们需要确保在删除固定标题之前 ScrollView 不会仍在拖动,就像用户抬起手指但 ScrollView 继续滚动时的情况一样。另外,由于时间延迟,我们在删除 ScrollView 之前检查 ScrollView 是否未拖动,以防用户在滚动停止后不到 0.5 秒内再次开始滚动。

override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
showPinnedHeaders()
}

override func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
showPinnedHeaders()
}

override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
removePinnedHeaders()
}

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
removePinnedHeaders()
}

private func showPinnedHeaders() {
for section in 0..<totalNumberOfSectionsInYourTableView {
tableView.headerView(forSection: section)?.isHidden = false
}
}

private func removePinnedHeaders() {
if let indexPathsForVisibleRows = tableView.indexPathsForVisibleRows {
if indexPathsForVisibleRows.count > 0 {
for indexPathForVisibleRow in indexPathsForVisibleRows {
if let header = tableView.headerView(forSection: indexPathForVisibleRow.section) {
if let cell = tableView.cellForRow(at: indexPathForVisibleRow) {
if header.frame.intersects(cell.frame) {
let seconds = 0.5
let delay = seconds * Double(NSEC_PER_SEC)
let dispatchTime = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: dispatchTime, execute: {
if !self.tableView.isDragging && header.frame.intersects(cell.frame) {
header.isHidden = true
}
})
}
}
}
}
}
}
}

另外将removePinnedHeaders()添加到viewDidAppear()以及任何其他将滚动tableView的旋转或键盘框架更改方法。

关于swift - 如何让 UITableView 的固定标题在滚动后隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41992409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com