[iOS 8] PhotoKit 3 – Photos Framework – モデルオブジェクトのプロパティの編集

はじめに

今回はモデルオブジェクトの編集を扱います。

Photos Frameworkのモデルオブジェクトはメタデータだけ保持し、メタデータを取得するためのプロパティは読み取り専用になっています。 プロパティやコンテンツ(写真やビデオの実データ)の編集は、編集作業用のオブジェクトを使って行います。

PHAssetのプロパティの編集

変更可能なプロパティには以下のようなものがあります

  • favorite (お気に入り登録済みかどうか、BOOL)
  • location (場所、CLLocation)
  • creationDate (作成日、NSDate)

今回はfavoriteプロパティの編集を行ってみます。

Assetを編集するにはまず、そのAssetが編集処理をサポートしているかを、 PHAssetクラスのcanPerformEditOperation:メソッドを使用して問い合わせます。 編集処理がサポートされていたら PHPhotoLibraryクラスのperformChanges:completionHandler:メソッドの 1つ目の引数のblock内に編集処理を記述します。 (PHPhotoLibraryはPhoto libraryを表すオブジェクトで、sharedPhotoLibraryメソッドでユーザーのPhoto libraryを取得できます。) 今回はfavoriteプロパティの編集を行うので、 PHAssetChangeRequestを作成し、favoriteプロパティの変更を指定します。

処理完了時の処理は、performChanges:completionHandler:メソッドの2つめのblockに記述します。

// 編集処理がサポートされているかを問い合わせる
// 引数にPHAssetEditOperationPropertiesを指定
if ([self.asset canPerformEditOperation:PHAssetEditOperationProperties]) {
    // Assetの編集を実行
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // PHAssetChangeRequestを作成、favoriteプロパティの変更を指定
        PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:self.asset];
        [request setFavorite:![self.asset isFavorite]];
        NSLog(@"%s setFavorite %@", __PRETTY_FUNCTION__, ([self.asset isFavorite] ? @"YES to NO": @"NO to YES"));
    } completionHandler:^(BOOL success, NSError *error) {
        if (!success) {
            NSLog(@"%s setFavorite Error: %@", __PRETTY_FUNCTION__, error);
        } else {
            NSLog(@"%s setFavorite success", __PRETTY_FUNCTION__);
        }
    }];
}

今回登場したクラスやメソッド

PHAsset

  • canPerformEditOperation:
    • 編集処理をサポートしているかどうかを返す

PHPhotoLibrary

  • Photo libraryを表すオブジェクト
  • sharedPhotoLibraryメソッドでユーザーのPhoto libraryを取得可能
    • Photos appによって管理されている全てのcollection/assetを含む
    • 端末内/iCloud上のcollection/assetオブジェクトを含む
  • 編集を実行するためのメソッドが用意されている
    • できることの例:
      • assetのメタデータやコンテンツの編集
      • 新しいassetの追加
      • collectionの構成の編集

PHAssetChangeRequest

  • PHPhotoLibraryクラスの変更メソッドのblock内で使用
    • PHAssetオブジェクトの作成、削除、編集時に使用
  • 変更可能なプロパティ
    • creationDate
    • location
    • favorite
    • hidden

PHCollectionListやPHAssetCollectionのプロパティの編集

PHCollectionListやPHAssetCollectionに関しても編集用のメソッドが用意されています。

PHCollection (PHCollectionList/PHAssetCollectionのスーパークラス)

クラス名 メソッド 内容
PHCollection - canPerformEditOperation: 編集処理がサポートされているかどうかを返す

PHCollectionList

クラス名 メソッド 内容
PHAssetCollectionChangeRequest changeRequestForAssetCollection: PHAssetCollection編集用のリクエストを作成
プロパティ名 内容
title collection listの表示名

PHAssetCollection

メソッド名 内容
+ changeRequestForAssetCollection: PHAssetCollection編集用のリクエストを作成
プロパティ名 内容
title asset collectionの表示名

まとめ

今回はモデルオブジェクトのプロパティの編集について説明しました。次回はモデルオブジェクトのコンテンツ自体の編集をやってみたいと思います。

参考資料

本シリーズの記事一覧