Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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)
        }
    }

}
naoyawatanabe
デザイナーです。 みてねというアプリを作っています。 https://mitene.us
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away