iOS13では、主にCatalystでの体験の統合を目的としてUITableView
やUICollectionView
に対して幾つかの拡張が加えられました。
この記事ではそのうちの1つの「iPadでショートカットキーを押しながら画面をタップ」を提供するAPIについて記載します。
記事の目的
- 辿り着きにくいマイナーAPIの一次情報への到達補助、情報統合
- APIの扱い方や注意事項の記載
WWDC
言及されているWWDCセッションは上記です。このセッションはResponder Chainについても解説をしている貴重なセッションのため、勉強になりオススメです。
このセッションの6:35~ぐらいから該当の内容が始まります。
実行可能なジェスチャ
UITableView、もしくはUICollectionViewに対して以下の3つを実行することができます。
- shiftを押しながら項目をタップすることで編集モードに自動突入しつつ選択できる
- 2本指でスクロールダウンかスクロールアップをすると、その編集モードに自動突入しつつ指定範囲を選択できる
- ⌘キーをホールドしながら複数のセルをタップして編集モードに自動突入しつつ選択する。
詳しい挙動はAppleのファイルアプリで挙動をお試しください。
利用するAPI
APIは非常にシンプルで、UITableViewDelegateに3つのデリゲートメソッドがあるのみです。
- tableView(_:shouldBeginMultipleSelectionInteractionAt:)
- tableView(_:didBeginMultipleSelectionInteractionAt:)
- tableViewDidEndMultipleSelectionInteraction(_:)
このshoudBeginでtrueを返すことによって、システムが自動で選択をonにしてくれます。
例えば「このデリゲートによって複数選択に突入した場合にnavigationBarのボタンをdoneやcancelに変えたい。終わったら戻したい」などの対応をする必要が出てくると思うのですが、それはdidBeginとdidEndのタイミングで実装可能です。
UICollectionViewの場合も同様に、UICollectionViewDelegateにて3種類のデリゲートメソッドがあります。
- collectionView(_:shouldBeginMultipleSelectionInteractionAt:)
- collectionView(_:didBeginMultipleSelectionInteractionAt:)
- collectionViewDidEndMultipleSelectionInteraction(_:)
扱い方・注意事項
編集モード
これらのデリゲートは、viewやviewControllerのsetEditing(_:animated:)を自動で呼び出してくれるわけではありません。(UITableViewControllerを利用している場合はスワイプの時のように自動でeditingを設定してくれるかもしれませんが、未検証です)なので、基本的には以下のように編集状態の設定を行う実装が必要です。
func tableView(_ tableView: UITableView, didBeginMultipleSelectionInteractionAt indexPath: IndexPath) {
self.setEditing(true, animated: true) // ViewControllerのsetEditingを呼び出し
}
公式解説付きサンプル
この解説ページを開き、上部の「Download」を実行することでサンプルがダウンロードできるので、お手元のシミュレーターや実機にて挙動を確かめられます。
Selecting Multiple Items with a Two-Finger Pan Gesture
関連セッション
こちらのセッションでセルのセレクションに関する新しいジェスチャーが紹介されています。