これは私のこの問題に対する解決策です。私は、これを行う簡単な方法があるのだろうかと思います。
ヘッダーがUITableViewHeaderFooterViewの場合にのみ機能します。ヘッダーにUITableViewCellを使用している場合はありません。 UITableViewCellを使用している場合、tableView.headerView(forSection:indexPathForVisibleRow.section)はnilを返します。
tableViewがスクロールを停止したときに固定ヘッダーを非表示にし、tableViewが再びスクロールを開始したときに再び表示されるようにするには、これらの4つのscrollViewデリゲートメソッドをオーバーライドします。
最初の2つ(scrollViewWillBeginDraggingおよびscrollViewWillBeginDecelerating)で、表示行の最初のセクションのセクションヘッダーを取得し、それが非表示になっていないことを確認します。
2番目の2つのデリゲートメソッドでは、表示されている行ごとに、その行のヘッダーフレームが行セルのフレームと重複していないことを確認します。そうであれば、これは固定されたヘッダであり、遅れてそれを隠す。ユーザーが指を持ち上げてもスクロールビューがスクロールし続ける場合のように、固定ヘッダーを削除する前にscrollViewがまだドラッグされていないことを確認する必要があります。また、ユーザーがスクロールを停止してから0.5秒以内に再度スクロールを開始する場合には、時間遅延のために、scrollViewがドラッグされていないことを確認します。
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をスクロールする他の回転やキーボード、フレームの変更方法。