写真を扱うアプリでは、『ライブラリから選択』『写真を撮る』という選択肢を用意するのが普通ですが、そのほかに『最新の写真を使う』という選択肢も用意しておくと便利です。
ここでは iOS の Photos.framework を使ってフォトライブラリから最新の写真を取得する方法を紹介します。
サンプルコード
var fetchResult = PHAssetCollection.fetchAssetCollectionsWithType(
.SmartAlbum,
subtype: .SmartAlbumUserLibrary,
options: nil
)
guard let assetCollection = fetchResult.firstObject as? PHAssetCollection else {
return
}
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: options)
guard let latestAsset = fetchResult.firstObject as? PHAsset else {
return
}
// latestAsset を使う
解説
まずは PHAssetCollection
の fetchAssetCollectionsWithType:subtype:options:
というメソッドで写真のコレクションを取得します。
サンプルコードでは type
に .SmartAlbum
を、subtype
に .SmartAlbumUserLibrary
を指定しているので、いわゆる『カメラロール』から写真を取得することになります。
別のアルバムから取得したい場合は、この type
と subtype
の組み合わせを変更する必要があります。
組み合わせについてはこちらが参考になります: (iOS8.1)PhotoKitで各種アルバムを取得する
var fetchResult = PHAssetCollection.fetchAssetCollectionsWithType(
.SmartAlbum,
subtype: .SmartAlbumUserLibrary,
options: nil
)
guard let assetCollection = fetchResult.firstObject as? PHAssetCollection else {
return
}
次に、PHAsset
の fetchAssetsInAssetCollection:options:
でコレクションから写真を取得します。
このとき、PHFetchOptions
の sortDiscriptor
にディスクリプタをセットすることで、写真をどのような順番で取得するかを指定できます。
サンプルコードでは写真を作成日で降順にソートするよう指定しています。
あとは取得結果の最初の要素を取り出せば、それが最新の写真になっているというわけです。
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: options)
guard let latestAsset = fetchResult.firstObject as? PHAsset else {
return
}
// latestAsset を使う