iOS:ギャラリーの操作(写真フレームワーク)

こんにちは、Habr! この記事では、Photosフレームワークを使用してギャラリーを操作する方法について書くことにしました。 この記事では、アルバムの作成、写真の保存、削除、ダウンロードのフレームワークの基本機能について検討します。 肯定的なレビューがある場合は、以下のパートで、ライブ写真、ビデオ、フィルタリング、キャッシュ、その他の機能の操作について説明します。



クラス概要



最初に、使用するクラスを検討します。 Photosフレームワークでは、すべてのクラスはPHObject基本クラスから継承されます。このクラスには、 localIdentifierという 1つのプロパティしかありません。



▍PHAsset



PHAssetは、写真、ビデオ、ライブ写真など、ギャラリーの1つのオブジェクトに関するデータです。 PHAssetはまだ写真ではなく、それに関する情報にすぎないことを理解することが重要です。



▍PHAssetCollection



これはPHAssetオブジェクトのコレクションです。 そのようなセットは、アルバム、瞬間、スマートアルバムかもしれません。



▍PHPhotoLibrary



これは、ギャラリーのデータを要求および変更するためのアクセスを提供するクラスです。 ギャラリーで何かを変更するたびに、 performChanges(changes:()→Void、completionHandler:(Bool、Error?)→Void)メソッドを呼び出す必要があります。



▍PHAssetCreationRequest



ギャラリーで新しいオブジェクト( PHAsset )を作成するリクエストを作成できるクラス。



▍PHAssetChangeRequest



ギャラリー内のオブジェクトを変更するリクエストを作成できるクラス。



▍PHAssetCollectionChangeRequest



ギャラリー内のオブジェクトのコレクションを変更するリクエストを作成できるクラス。



▍PHImageManager



特定のPHAssetに関連付けられた写真またはビデオを取得できます。



▍PHFetchResult



要求の結果として受信したPHAssetsのリストのラッパーを表します。



アルバム作成



最初に、作成したい土地のアルバムがあるかどうかを確認する必要があります。



let options = PHFetchOptions() options.predicate = NSPredicate(format: "title = %@", albumTitle) let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: options) if let album = collection.firstObject { //   ,    }
      
      





アルバムがない場合、アルバムを作成するには、 PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:String)メソッドを使用してリクエストを作成する必要があります。



 var placeholder: PHObjectPlaceholder? PHPhotoLibrary.shared().performChanges({ let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumTitle) placeholder = request.placeholderForCreatedAssetCollection }, completionHandler: { (success, error) -> Void in if success { if let id = placeholder?.localIdentifier { let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [id], options: nil) if let album = fetchResult.firstObject { //    } } } })
      
      





PHObjectPlaceholderPHObjectの後継であり 、基本的には作成された実際のオブジェクトのプロキシです(この場合、これはアルバムです)。 作成されたオブジェクトのIDを取得するために必要です。



PHAssetリストの取得



そのため、 PHAssetオブジェクトを保存するアルバム(またはPHAssetCollection )を取得しました。 次のようにして、すべてのPHAssetを取得できます。



 let options = PHFetchOptions() options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: ascending)] let assets: PHFetchResult<PHAsset> = PHAsset.fetchAssets(in: album, options: options)
      
      





アセット変数には、昇順の写真作成日でソートされたPHAssetリストが格納されます。 たとえば、次のような特定のPHAssetを取得できます。



 if assets.count > 0 { let firstAsset = assets[0] }
      
      





UIImageの取得



特定のPHAssetの画像を読み込むには、 PHImageManagerクラスが必要です。



 PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: .aspectFill, options: options) { (image, _) -> Void in //    }
      
      





画像を保存しています



画像を保存するには、 PHAssetChangeRequest.creationRequestForAsset(from image:UIImage)メソッドを使用してリクエストを作成する必要があります:



 PHPhotoLibrary.shared().performChanges({ let assetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image) let albumChangeRequest = PHAssetCollectionChangeRequest(for: album, assets: assets) if let assetPlaceholder = assetRequest.placeholderForCreatedAsset { let assetPlaceholders: NSArray = [assetPlaceholder] albumChangeRequest?.addAssets(assetPlaceholders) } }, completionHandler: nil)
      
      





PHAssetを削除



それで、私たちは最も難しいことになりました。 PHAssetを削除するは、 PHAssetChangeRequest.deleteAssets(_ asset:NSFastEnumeration)メソッドが必要です。



 PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.deleteAssets(assets as NSFastEnumeration) }, completionHandler: nil)
      
      





おわりに



フレームワークの基本機能について説明しました。 将来的には、他の可能性に関する記事を書きます。 明確ではないすべて-コメントで尋ねてください。 どんな批判も歓迎します。



便利なリンク



» 写真フレームワークリファレンス| りんご

» 写真フレームワーク| objc.io



All Articles