[iOS 10] UIPreviewInteraction を使ってアプリ上で Force Touch を受け付ける

2016.10.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Peak & Pop

UIPreviewInteraction は、ビューで Force Touch を受け取るために使う iOS 10 から追加されたクラスです。このクラスを使うと、特定のビューで Force Touch のインタラクションを受け取ることができます。

今回はこの UIPreviewInteraction を使って、アプリの画面上で Force Touch のイベントを受け取る実装を試したいと思います。

UIPreviewInteraction と UIPreviewInteractionDelegate

基本的には、UIPreviewInteraction のイニシャライザ引数に Force Touch に対応するビューを渡してインスタンス化するだけです。また、UIPreviewInteractionDelegate プロトコルをビューコントローラなどに準拠させ、そのビューコントローラを UIPreviewInteraction インスタンスの delegate プロパティに代入します。

今回は、ルートのビューを対象とします。つまり画面全体です。

ViewController.swift

import UIKit

class ViewController: UIViewController, UIPreviewInteractionDelegate {

    var previewInteraction: UIPreviewInteraction!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // インスタンス化
        previewInteraction = UIPreviewInteraction(view: view)
        // delegateにビューコントローラを代入
        previewInteraction.delegate = self
    }
    
    // required
    
    func previewInteraction(_ previewInteraction: UIPreviewInteraction, didUpdatePreviewTransition transitionProgress: CGFloat, ended: Bool) {
        print("プレビュー中! \(transitionProgress)")
        if ended {
            print("プレビュー完了!")
        }
    }
    
    func previewInteractionDidCancel(_ previewInteraction: UIPreviewInteraction) {
        print("キャンセル!")
    }
    
    // optional
    
    func previewInteraction(_ previewInteraction: UIPreviewInteraction, didUpdateCommitTransition transitionProgress: CGFloat, ended: Bool) {
        print("コミット中! \(transitionProgress)")
        if ended {
            print("コミット完了!")
        }
    }

}

Force Touch は、ユーザーの押し具合によって大きく「プレビュー状態」と「コミット状態」の2段階に分かれています。previewInteraction(_:didUpdatePreviewTransition:) メソッドはプレビュー状態の押し具合を受け取ることができるメソッドです。また、previewInteractionDidCancel(_:) メソッドはキャンセルした時のイベントを受け取ることができるメソッドです。この2つのメソッドは必ず実装しなければいけません。

previewInteraction(_:didUpdateCommitTransition:) は、コミット状態の押し具合を受け取ることができるメソッドです。Optional となっているため必ず実装しなければいけないというわけではありませんが、実際に試してみるとこの状態になることが多いので、実装することをお勧めします。

ブログ上では Force Touch の押し具合を紹介することはできませんが、print(_:) 関数で出力したログをコンソールで見てみると、下図のようになります。

ui-preview-interaction

まとめ

Force Touch が使えるデバイスは今の所まだ限られていますが、シェア率は日に日に高まっていくことでしょう。対応しておくと、ユーザーにとってより使いやすく、より楽しめるアプリになるのではないでしょうか。

参考