Help us understand the problem. What is going on with this article?

Live Photos(ライブフォト)を表示するクラス PHLivePhotoView を試す

More than 3 years have passed since last update.

iOS 9.1 で追加された PHLivePhoto, PHLivePhotoView を使ってみます。

各種フレームワークのインポート

まずは Photos, PhotosUI, MobileCoreService を import します。

import Photos
import PhotosUI
import MobileCoreServices

Photos は PHLivePhoto、PhotosUI は PHLivePhotoView を使うために必要で、MobileCoreServices はピッカーにメディアタイプを指定するのに必要になります。(なので、UIImagePickerController を使わないなら必要ない)

PHLivePhotoView のセットアップ

プロパティを定義して、

@IBOutlet weak var livePhotoView: PHLivePhotoView!

storyboard で適当な UIView オブジェクトを置いて、クラスを PHLivePhotoView にして、アウトレットを接続します。

PHLivePhotoViewDelegate への準拠を宣言しておきます。

class ViewController: UIViewController, PHLivePhotoViewDelegate

viewDidLoad あたりで PHLivePhotoView の各種プロパティを必要に応じてセットします。

livePhotoView.contentMode = UIViewContentMode.ScaleAspectFit
livePhotoView.delegate = self

ライブフォト選択

ここでは UIImagePickerController を使うことにします。

UIImagePickerControllerDelegate, UINavigationControllerDelegate プロトコルへの準拠を宣言しておきます。

class ViewController: UIViewController, PHLivePhotoViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate

こんな感じでピッカーを表示するアクションメソッドを実装します。

@IBAction func pickerBtnTapped(sender: UIButton) {

    let picker = UIImagePickerController()
    picker.sourceType = .PhotoLibrary
    picker.delegate = self
    picker.mediaTypes = [kUTTypeImage as String, kUTTypeLivePhoto as String]

    self.presentViewController(picker, animated: true, completion: nil)
}

mediaTypeskUTTypeLivePhoto を入れるところが肝ではありますが、kUTTypeImage も入れないといけない(入れないと実行時に怒られる)ので、結局ライブフォトではない画像もリストに出てきてしまいます。。

選択されたときに呼ばれるデリゲートメソッドを実装します。

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    self.dismissViewControllerAnimated(true, completion: nil)

    let livePhoto = info[UIImagePickerControllerLivePhoto] as? PHLivePhoto

    if let livePhoto = livePhoto {

        // ライブフォトを表示・再生する(後述)
    }
}

info 辞書から UIImagePickerControllerLivePhoto キーで PHLivePhoto オブジェクトが取り出せる点がここでのポイントになります。

参考記事:

再生する

先ほど取得した PHLivePhoto オブジェクトを、PHLivePhotoView の livePhoto にセットし、startPlaybackWithStyle: メソッドで再生開始するだけ。

livePhotoView.livePhoto = livePhoto
livePhotoView.startPlaybackWithStyle(.Full)

ちなみに startPlayback〜 の引数には

case Undefined
case Full
case Hint

のいずれかが指定できます。

リピート再生

繰り返し再生したければ、PHLivePhotoDelegate の livePhotoView:didEndPlaybackWithStyle: を実装しておき、そこで再生を再開するようにします。

func livePhotoView(livePhotoView: PHLivePhotoView, didEndPlaybackWithStyle playbackStyle: PHLivePhotoViewPlaybackStyle) {
    print(__FUNCTION__+"\n")

    livePhotoView.startPlaybackWithStyle(.Full)
}

出来上がり

その他

音を消す

PHLivePhotoView の muted プロパティに true をセットすれば良さそうです(試していません)

ジェスチャーで再生操作

PHLivePhotoView の playbackGestureRecognizer プロパティを print してみたら、

<UILongPressGestureRecognizer: 0x15ee554f0; state = Possible; view = <ISPlayerView 0x15ee46340>; targets= <(
    "(action=_handlePress:, target=<ISForcePressPlaybackInput 0x15ee54ec0>)",
    "(action=_handleGesture:, target=<ISPlayerView 0x15ee46340>)"

こうなったので、最初からジェスチャーで再生をコントロールできるようになっているようです。(自動繰り返し処理を止めて、強タップを試してみたら再生開始しました)

サンプルコード

同様のサンプルを iOS-9-Sampler に追加してあります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした