UITableViewで一番下までスクロールする方法

概要

UITableViewで一番下のセルまでスクロールする方法についてまとめました。

実装方法

UITableView#scrollToRow(at:at:animated)を使います。

第一引数のIndexPathにはrowとsectionを指定します。 この時にデータ配列から一番最後を指定することで一番下のセルまでスクロールできるようになります。

もしセクションが複数個の場合は、一番最後のセクション番号を指定しないといけません。 セクションは固定であれば数えて一番最後のセクション、動的であれば元となるデータ配列の一番最後を指定してください。

実装コード

class ViewController: UIViewController,
                      UITableViewDataSource,
                      UITableViewDelegate {
    @IBOutlet private weak var tableView: UITableView!
    private var data: [Data] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
        
        Array(0..<100).forEach {
            data.append(Data(name: "\($0)"))
        }
    }
    
    // MARK: - UITableViewDataSource and UITableViewDelegate
    func tableView(_ tableView: UITableView,
                   numberOfRowsInSection section: Int) -> Int {
        return data.count
    }
    
    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        if cell == nil {
            cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
        }
        cell?.textLabel?.text = data[indexPath.row].name
        return cell!
    }
    
    func tableView(_ tableView: UITableView,
                   didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        tableView.scrollToRow(at: IndexPath(row: data.count - 1, section: 0),
                              at: UITableViewScrollPosition.bottom, animated: true)
    }
}

struct Data {
    let name: String
}

UITableViewScrollPosition.bottom はセルをスクリーンのどの位置に合わせるかのパラメータになります。 今回は一番のセルなのでbottom にしていれば問題ありません。