UITableViewやUICollectionViewをスクロールで閉じる

TableViewやCollectionViewでスクロールで一番上までいってたら(contentOffset.yがマイナスだったら)閉じたい場合がたまにある。

PanGestureを使って細やかにハンドリングした方が手触り感としては良くできるのだが若干手間ではある。

この方法だととてもシンプルに実装できたのでメモ。

// テーブルビュー

import UIKit

class TableViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!
var dataSource: UITableViewDataSource!

override func viewDidLoad() {
super.viewDidLoad()
configure()
}

func configure() {
dataSource = UITableViewDataSource()
tableView.dataSource = dataSource
tableView.delegate = self
}

}

extension TableViewController: UITableViewDelegate {
}

extension TableViewController: UIScrollViewDelegate {

func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffsetY = scrollView.contentOffset.y + view.safeAreaInsets.top // StatusBar, NavigationBarの高さを足してオフセットを0に
let threshold: CGFloat = -60.0 // どの程度マイナス方向にスクロールしたらdismissするか
if contentOffsetY < threshold {
dismiss(animated: true, completion: nil)
}
}

}

// コレクションビュー

import UIKit

class CollectionViewController: UIViewController {

@IBOutlet weak var collectionView: UICollectionView!
var dataSource: UICollectionViewDataSource!

override func viewDidLoad() {
super.viewDidLoad()
configure()
}

func configure() {
dataSource = UICollectionViewDataSource()
collectionView.dataSource = dataSource
collectionView.delegate = self
}

}

extension CollectionViewController: UICollectionViewDelegate {
}

extension CollectionViewController: UIScrollViewDelegate {

func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffsetY = scrollView.contentOffset.y + view.safeAreaInsets.top // StatusBar, NavigationBarの高さを足してオフセットを0に
let threshold: CGFloat = -60.0 // どの程度マイナス方向にスクロールしたらdismissするか
if contentOffsetY < threshold {
dismiss(animated: true, completion: nil)
}
}

}