クラス概要
最初に、使用するクラスを検討します。 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