こんにちは、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 {
PHObjectPlaceholderは
PHObjectの後継で
あり 、基本的には作成された実際のオブジェクトのプロキシです(この場合、これはアルバムです)。 作成されたオブジェクトの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