[iOS 8] PhotoKit 8 – UIImagePickerControllerとPhotos Frameworkを組み合わせて使う

はじめに

ios8-photo-kit-8_00

UIImagePickerControllerを使えば、以下のような機能を簡単に実装することができます。

  • カメラで写真を撮影する
  • フォトライブラリから写真を選択する

実装は簡単ですが、実現したい機能によってはPhotos Frameworkなどのフレームワークと組み合わせる必要があります。 今回は、 UIImagePickerControllerで写真の選択と取得を行い、選択された写真のメタデータをPhotos Frameworkの機能を使用して取得してみたいと思います。

Photos Frameworkの機能を使用することで、写真のメタデータを保持するPHAssetを取得することができます。 PHAssetのプロパティには以下のようなものがあります。

プロパティ名 内容
creationDate NSDate 撮影日
modificationDate NSDate 変更日
favorite BOOL お気に入りされているかどうか
pixelWidth NSUInteger 幅(単位:ピクセル)
pixelHeight NSUInteger 高さ(単位:ピクセル)
location CLLocation 撮影場所

実装

UIImagePickerControllerDelegateimagePickerController:didFinishPickingMediaWithInfo:メソッドは、 ユーザーが写真の選択を完了したタイミングで呼ばれます。 このメソッドの第2引数のinfoの中には、 Assets Library frameworkによって提供されるURLが格納されているので、 まずはこのURLを取り出します。

取り出したURLは、PHAssetのfetchAssetsWithALAssetURLs:options:メソッドで使用します。 このメソッドはAssets Library frameworkによって提供されるURLを使用して PHAssetをフェッチするメソッドであり、 取り出したPHAssetを使用して写真のメタデータを取得できます。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // UIImagePickerControllerで選択された写真を取得する
    self.imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];

    // Assets Library frameworkによって提供されるURLを取得する
    NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];

    // 取得したURLを使用して、PHAssetを取得する
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[url,] options:nil];
    PHAsset *asset = fetchResult.firstObject;

    // ラベルのテキストを更新する
    self.dateLabel.text = asset.creationDate.description;
    self.favoritelabel.text = (asset.favorite ? @"registered Favorites" : @"not registered Favorites");

    [self dismissViewControllerAnimated:YES completion:nil];
}

まとめ

今回はUIImagePickerControllerとPhotos Frameworkを組み合わせて使う例について解説しました。 オリジナルの写真選択UIを実装する必要が特にないのであれば、 写真の選択/取得機能をUIImagePickerControllerに任せてしまうことができます。

なお、今回作成したサンプルプロジェクトは以下のリポジトリで公開しています。

本シリーズの記事一覧