Как получить название альбома фотографий, количество изображений в Swift?
Я создаю приложение Gallery, как стандартное приложение Photos для iOS. (Swift 4.1)
Я хочу получить эскизы, заголовки и общее количество изображений, которые я вижу при запуске стандартного приложения для фотографий.
Рамка для фотографий кажется более сложной, чем я думал.
Нелегко найти способ объяснить, почему и к каким процедурам следует подходить.
Можете ли вы рассказать мне об этом?
2 ответа
Минимальное количество шагов для достижения того, что вы просите:
// import the framework
import Photos
// get the albums list
let albumList = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)
// you can access the number of albums with
albumList.count
// individual objects with
let album = albumList.object(at: 0)
// eg. get the name of the album
album.localizedTitle
// get the assets in a collection
func getAssets(fromCollection collection: PHAssetCollection) -> PHFetchResult<PHAsset> {
let photosOptions = PHFetchOptions()
photosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
photosOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue)
return PHAsset.fetchAssets(in: collection, options: photosOptions)
}
// eg.
albumList.enumerateObjects { (coll, _, _) in
let result = self.getAssets(fromCollection: coll)
print("\(coll.localizedTitle): \(result.count)")
}
// Now you can:
// access the count of assets in the PHFetchResult
result.count
// get an asset (eg. in a UITableView)
let asset = result.object(at: indexPath.row)
// get the "real" image
PHCachingImageManager.default().requestImage(for: asset, targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: nil) { (image, _) in
// do something with the image
}
Я также предлагаю взглянуть на пример кода Apple для платформы Photoshop, не трудно следовать, вместе с документацией Framework Photos.
Вы можете попробовать что-то вроде этого:
import Photos
func fetchCustomAlbumPhotos( completion : (_ array : [PHAsset]) -> Void) {
var assetCollection = PHAssetCollection()
var photoAssets = PHFetchResult<AnyObject>()
var arrayOfPHAsset = [PHAsset]()
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "title = %@", CustomAlbum.albumName)
let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)
if let _:AnyObject = collection.firstObject{
assetCollection = collection.firstObject!
}else {
completion([])
}
_ = collection.count
photoAssets = PHAsset.fetchAssets(in: assetCollection, options: nil) as! PHFetchResult<AnyObject>
photoAssets.enumerateObjects({(object: AnyObject!,
count: Int,
stop: UnsafeMutablePointer<ObjCBool>) in
if object is PHAsset{
If let asset = object as? PHAsset {
arrayOfPHAsset.append(asset)
}
}
})
completion(arrayOfPHAsset)
}
CustomAlbum().fetchCustomAlbumPhotos { (array) in
// array will have all PHAsset
}
Эта функция возвращает фотографии из моего собственного альбома, вы можете удалить строку NSPredicate, чтобы получить все фотографии.
Затем вы можете увидеть все свойства PHAsset.