App Clipsの実装が一段落し、次はユーザーが記録に添付した写真の中にLive Photosが含まれる場合、そのまま再生できるようにしたくなり実装に挑戦しました。
1. 通常の画像と同じ感覚で表示できると思っていた
最初、Live PhotosもUIImageViewに読み込めば表示できる普通の画像の一種だと思い込んでいました。
UIImageView: 静止画のみ表示
PHLivePhotoView: Live Photos専用の表示コンポーネント
Live Photosは静止画と短い動画・音声がセットになったデータ形式で、専用のPHLivePhotoViewというコンポーネントを使わないと、動く・音が鳴るという体験を再現できませんでした。普通の画像ビューにそのまま読み込むと、静止画部分しか表示されませんでした。
2. 再生のトリガーが自動だと思い込んでいた
PHLivePhotoViewを画面に配置しただけで、動画部分が自動的に再生されるものだと思っていたのですが、実際には何も起きませんでした。
Live Photosは長押し(3D Touch相当のプレスジェスチャー)によって再生が開始する設計になっており、自動再生はされません。コードから明示的に再生を開始したい場合は、startPlayback(with:)のようなメソッドを呼び出す必要があると分かりました。ユーザー操作前提の機能だという理解が抜けていました。
3. 写真ライブラリから取得した際に動画部分が欠けることがあった
PHPickerで写真を選択する処理を流用してLive Photosを取得しようとしたところ、静止画部分は取得できるのに動画部分がうまく取得できないことがありました。
NSItemProviderからLive Photosを読み込む際は、通常の画像とは異なる型(PHLivePhoto)を明示的に指定してリクエストする必要がありました。画像として読み込む処理をそのまま流用していたのが原因で、Live Photos専用の読み込み処理を別途用意することで解決しました。
4. 共有機能に渡したらただの静止画になってしまった
共有機能(UIActivityViewController)にLive Photosをそのまま渡して共有しようとしたところ、共有先によってはただの静止画として扱われてしまう現象に戸惑いました。
Live Photosという形式自体を認識できるアプリでなければ、静止画部分だけが使われるのは仕様上避けられない挙動だと分かりました。共有先の対応状況に依存する機能だと理解した上で、必要であれば「静止画として共有」という代替の導線も用意しておくとよいと学びました。
まとめ
- Live Photosの表示には
PHLivePhotoViewという専用のコンポーネントが必要。通常の画像ビューでは動かない - 再生は長押しジェスチャーが前提。自動再生させたい場合は明示的にAPIを呼び出す
- 写真ライブラリからの取得時は
PHLivePhoto型を明示的に指定しないと動画部分が欠けることがある - 共有先がLive Photos非対応の場合、静止画として扱われる。共有先に依存する仕様だと理解しておく
見た目には地味な機能ですが、静止画とは異なる設計・API・ユーザー操作を前提にした、独立した機能として扱う必要があると実感しました。
次は、Swift Concurrencyのactorを実装してみて分かったことをまとめます。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント