24
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UITableViewControllerを 3D Touch の Peek and Pop (プレビュー機能) に最短で対応させる方法

Last updated at Posted at 2015-11-19

思っていたよりも簡単に対応できました。
UITableViewController以外で Peek and Pop を行いたい場合も参考になると思います。

  1. 3D Touch を検知するviewとdelegate先を registerForPreviewingWithDelegate:sourceView: で登録する

    override func viewDidLoad() {
        super.viewDidLoad()
        registerForPreviewingWithDelegate(self, sourceView: tableView)
    }
    
  2. delegateを受け取るUITableViewControllerで UIViewControllerPreviewingDelegate プロトコルを採用する

    class MyTableViewController: UITableViewController, UIViewControllerPreviewingDelegate {
        // ...
    }
    
  3. 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
    }
    
  4. 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)
        }
    }
    

参考

Apple公式
https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/3DTouchAPIs.html#//apple_ref/doc/uid/TP40016543-CH4-SW1

とても詳しくわかりやすい解説
http://krakendev.io/peek-pop/

24
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?