2014-09-22 46 views
42

如何在iOS8中获取所有相册(包括相机胶卷(现在称为时刻))的列表?iOS 8照片框架:获取iOS8所有相册的列表

在iOS 7中,我使用ALAssetGroup枚举块,但不包括iOS时刻,它似乎与iOS7中的Camera Roll等效。

void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if (group == nil) {// We're done enumerating 
      return; 
     } 

     [group setAssetsFilter:[ALAssetsFilter allAssets]]; 
     if ([[sGroupPropertyName lowercaseString] isEqualToString:@"camera roll"] && nType == ALAssetsGroupSavedPhotos) { 
      [_assetGroups insertObject:group atIndex:0]; 
     } else { 
      [_assetGroups addObject:group]; 
     } 
    }; 

    // Group Enumerator Failure Block 
    void (^assetGroupEnumberatorFailure)(NSError *) = ^(NSError *error) { 
     SMELog(@"Enumeration occured %@", [error description]); 
    }; 

    // Enumerate Albums 
    [_library enumerateGroupsWithTypes:kSupportedALAlbumsMask 
          usingBlock:assetGroupEnumerator 
          failureBlock:assetGroupEnumberatorFailure]; 
    }]; 

回答

117

使用PhotosFramework有点不同,你可以达到相同的结果,但你只需要在零件中完成。

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); 
}]; 

对于从PHFetchResult *userAlbums返回各PHAssetCollection,你可以像这样取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要注意如果estimatedAssetCount无法确定,则collection.estimatedAssetCount可返回NSNotFound。正如标题所示,这是估计的。如果你想确保你有进行抓取,并得到像计数资产的数目:

PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil]; 

多项资产= assetsFetchResult.count

苹果有一个示例项目,你想要做什么:

https://developer.apple.com/library/content/samplecode/UsingPhotosFramework/ExampleappusingPhotosframework.zip(必须是已注册的开发人员访问此)

+1

嘿@拉迪斯拉夫,很好的答案。但你怎么知道使用'creationDate'作为sortDescriptor,照片属性是否记录在任何地方? – snowbound 2015-07-15 03:35:24

+3

苹果公司在此有一个非常好的文档 - https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHFetchOptions_Class/index。请看一下sortDescriptors,你会看到: “构建带有你想要获取的照片实体属性的排序描述符,如表1所列。”#://apple_ref/doc/uid/TP40014396-CH1-SW5 “例如,以下代码按照创建日期进行排序,以查找照片库中最旧的资源。“ 表1具有可用于PHAsset,PHAssetCollection,PHCollectionList,PHCollection的所有属性... – Ladislav 2015-07-17 17:59:04

+0

谢谢。正是我在找什么! – snowbound 2015-07-20 06:38:13

16

这是一个简单的@拉吉斯拉夫的高超接受的答案翻译成斯威夫特:

// *** 1 *** 
// Get all photos (Moments in iOS8, or Camera Roll before) 
// Optionally if you want them ordered as by creation date, you just add PHFetchOptions like so: 
let allPhotosOptions = PHFetchOptions() 
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] 

let allPhotosResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: allPhotosOptions) 

// Now if you want you can get assets from the PHFetchResult object: 
allPhotosResult.enumerateObjectsUsingBlock({ print("Asset \($0.0)") }) 

// *** 2 *** 
// Get all user albums (with additional sort for example to only show albums with at least one photo) 
let userAlbumsOptions = PHFetchOptions() 
userAlbumsOptions.predicate = NSPredicate(format: "estimatedAssetCount > 0") 

let userAlbums = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: userAlbumsOptions) 

userAlbums.enumerateObjectsUsingBlock({ 
    if let collection = $0.0 as? PHAssetCollection { 
     print("album title: \(collection.localizedTitle)") 
     //For each PHAssetCollection that is returned from userAlbums: PHFetchResult you can fetch PHAssets like so (you can even limit results to include only photo assets): 
     let onlyImagesOptions = PHFetchOptions() 
     onlyImagesOptions.predicate = NSPredicate(format: "mediaType = %i", PHAssetMediaType.Image.rawValue) 
     if let result = PHAsset.fetchKeyAssetsInAssetCollection(collection, options: onlyImagesOptions) { 
      print("Images count: \(result.count)") 
     } 
    } 
}) 

// *** 3 *** 
// Get smart albums 

let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .AlbumRegular, options: nil) // Here you can specify Photostream, etc. as PHAssetCollectionSubtype.xxx 
smartAlbums.enumerateObjectsUsingBlock({ 
    if let assetCollection = $0.0 as? PHAssetCollection { 
     print("album title: \(assetCollection.localizedTitle)") 
     // One thing to note with Smart Albums is that collection.estimatedAssetCount can return NSNotFound if estimatedAssetCount cannot be determined. As title suggest this is estimated. If you want to be sure of number of assets you have to perform fetch and get the count like: 

     let assetsFetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: nil) 
     let numberOfAssets = assetsFetchResult.count 
     let estimatedCount = (assetCollection.estimatedAssetCount == NSNotFound) ? -1 : assetCollection.estimatedAssetCount 
     print("Assets count: \(numberOfAssets), estimate: \(estimatedCount)") 
    } 
}) 
+0

非常感谢! – 2017-08-19 07:26:48

+0

嗨@Grimxn,我知道吗,只能在照片库中获取最后导入的照片。根据创建日期排序,我们也可以获取所有图像。但我的要求只是取回最后导入的照片。因为我们使用外置摄像头拍摄照片并复制到IPAD。那么,如何在应用程序结束时获取“上次导入照片”? – lakshmanbob 2017-09-04 08:59:26

+0

我目前没有处理这个问题,但我想你需要枚举资产集合https:// developer.apple.com/documentation/photos/phassetcollection#1656287'并检查他们的'assetCollectionType's。 .. – Grimxn 2017-09-04 12:23:35

0

试试这个代码...

self.imageArray = [[NSArray中的alloc] INIT];

PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init]; 
requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact; 
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; 
requestOptions.synchronous = true; 
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

NSLog(@"%d",(int)result.count); 

    PHImageManager *manager = [PHImageManager defaultManager]; 
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:countValue]; 

    // assets contains PHAsset objects. 

    __block UIImage *ima; 
    for (PHAsset *asset in result) { 
     // Do something with the asset 

     [manager requestImageForAsset:asset 
          targetSize:PHImageManagerMaximumSize 
          contentMode:PHImageContentModeDefault 
           options:requestOptions 
         resultHandler:^void(UIImage *image, NSDictionary *info) { 
          ima = image; 

          [images addObject:ima]; 

         }]; 




    self.imageArray = [images copy]; 
相关问题