Использование Photos Framework немного отличается, вы можете добиться того же результата, хотя вам просто нужно сделать это по частям.
1) Получить все фотографии (Моменты в iOS8 или Фотопленка раньше)
PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
При желании, если вы хотите, чтобы они заказаны по дате создания, вы просто добавить PHFetchOptions
так:
PHFetchOptions *allPhotosOptions = [PHFetchOptions new];
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:allPhotosOptions];
Теперь, если вы хотите, вы можете получить средства от PHFetchResult
объекта:
[allPhotosResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
NSLog(@"asset %@", asset);
}];
2) Получить все пользовательские альбомы (с дополнительным рода, например, чтобы показывать только альбомы, по крайней мере, одну фотографию)
PHFetchOptions *userAlbumsOptions = [PHFetchOptions new];
userAlbumsOptions.predicate = [NSPredicate predicateWithFormat:@"estimatedAssetCount > 0"];
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:userAlbumsOptions];
[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {
NSLog(@"album title %@", collection.localizedTitle);
}];
Для каждого PHAssetCollection
, который возвращается из PHFetchResult *userAlbums
вы можете получить PHAssets
как так (вы даже можете ограничить результаты включать только фото активы):
PHFetchOptions *onlyImagesOptions = [PHFetchOptions new];
onlyImagesOptions.predicate = [NSPredicate predicateWithFormat:@"mediaType = %i", PHAssetMediaTypeImage];
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:onlyImagesOptions];
3) Получить смарт-альбомов
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {
NSLog(@"album title %@", collection.localizedTitle);
}];
одно замечание с S mart, то, что collection.estimatedAssetCount
может вернуть NSNotFound
, если не оценено. Как видно из названия, это оценивается. Если вы хотите быть уверены в ряде активов, которые Вы должны выполнить выборку и получить количество, как:
PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
числа активов = assetsFetchResult.count
Apple, имеет пример проекта, который делает то, что вы хотите:
https://developer.apple.com/library/content/samplecode/UsingPhotosFramework/ExampleappusingPhotosframework.zip (вы должны быть зарегистрированным разработчиком, чтобы получить доступ к этому)
Эй, @Ladislav, отличный ответ. Но как вы узнали, что использовать 'creationDate' для sortDescriptor, являются ли атрибуты фотографий документированными где угодно? – snowbound
На этой странице есть очень хорошая документация от Apple - https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHFetchOptions_Class/index.html # // apple_ref/doc/uid/TP40014396-CH1-SW5 Посмотрите на sortDescriptors, и вы увидите: «Создайте дескрипторы сортировки со свойствами объектов фотографии, которые вы хотите получить, перечисленные в таблице 1 Например, следующий код сортирует по дате создания, чтобы найти самый старый актив в библиотеке фотографий ». Таблица 1 содержит все свойства, которые вы можете использовать для PHAsset, PHAssetCollection, PHCollectionList, PHCollection ... – Ladislav
Спасибо. Именно то, что я искал! – snowbound