思っていたよりも簡単に対応できました。
UITableViewController以外で Peek and Pop を行いたい場合も参考になると思います。
-
3D Touch を検知するviewとdelegate先を
registerForPreviewingWithDelegate:sourceView:
で登録するoverride func viewDidLoad() { super.viewDidLoad() registerForPreviewingWithDelegate(self, sourceView: tableView) }
-
delegateを受け取るUITableViewControllerで
UIViewControllerPreviewingDelegate
プロトコルを採用するclass MyTableViewController: UITableViewController, UIViewControllerPreviewingDelegate { // ... }
-
delegateメソッド
previewingContext:viewControllerForLocation:
で 3D Touch を検出する範囲と、その範囲をタッチされた際に表示するPeek画面 (プレビュー画面) を指定するprivate var previewingViewController: UIViewController? // ~~~ func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { if let indexPath = tableView.indexPathForRowAtPoint(location) { // 3D Touch の範囲を指定 previewingContext.sourceRect = tableView.rectForRowAtIndexPath(indexPath) // Peek画面 (プレビュー画面) を返す let object = objects[indexPath.row] previewingViewController = NextViewController(object) return previewingViewController } return nil }
delegateメソッド
previewingContext:commitViewController:
でPopしたとき (Peekした後に更に強く押したとき) の挙動を記述する
-
Peek (プレビュー) した画面を使い回す場合
この場合、画面がぼよんとするアニメーションが付きます。func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) { if let previewingViewController = previewingViewController // 画面遷移させる showViewController(previewingViewController, sender: self) } }
-
Peek (プレビュー) した画面とは別の画面をPopする場合
func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) { if let indexPath = tableView.indexPathForRowAtPoint(CGPointMake(previewingContext.sourceRect.midX, previewingContext.sourceRect.midY)) { // 画面遷移させる let object = objects[indexPath.row] let viewController = AnotherViewController(object) showViewController(viewController, sender: self) } }
参考
とても詳しくわかりやすい解説
http://krakendev.io/peek-pop/