2017-02-02 44 views
0

テーブルビューの現在の動作であるトップに固定することで、ユーザーがスクロールするときにtableViewHeadersを表示したいと考えています。しかし、tableViewがスクロールを停止すると、これらの '固定された'ヘッダーを削除します。私は私のscrollViewのデリゲートメソッドで次のように使用して、私のcollectionViewプロジェクトでこれを実現しています:スクロール後にUITableViewの固定ヘッダーを非表示にする方法

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

はのtableViewの「ピン留め」(スティッキー)ヘッダを非表示に類似した方法はありますか?私はtableViewControllerを使用しています。

答えて

0

これは私のこの問題に対する解決策です。私は、これを行う簡単な方法があるのだろうかと思います。

ヘッダーが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をスクロールする他の回転やキーボード、フレームの変更方法。

関連する問題