iOS相冊實現與AssetsLibrary框架使用

概述


在iOS中如果想要獲取手機相冊裏面的圖片或者視頻的話就要用到系統自帶的AssetsLibrary框架,AssetsLibrary.framework中包含以下文件

#import <AssetsLibrary/ALAsset.h>
#import <AssetsLibrary/ALAssetsFilter.h>
#import <AssetsLibrary/ALAssetsGroup.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import <AssetsLibrary/ALAssetRepresentation.h>
  • ALAsset.h
    從本地相冊獲取的圖片或者視頻的對象都是ALAsset類型的對象。

  • ALAssetsFilter
    顧名思義是對本地所有資源的過濾篩選,可以選擇只獲取照片,只獲取視頻,或者獲取所有的資源。

  • ALAssetsGroup
    本地相冊分組對象,本地有多少個相薄就會有幾個ALAssetsGroup類型的對象。

  • ALAssetsLibrary
    本地資源庫對象

  • ALAssetRepresentation
    ALAssetRepresentation對象來獲取視頻或者圖片的url,文件名,二進制數據,封面縮略圖等


AssetsLibrary使用


使用前導入AssetsLibrary.framework

#import <AssetsLibrary/AssetsLibrary.h>

獲取本地所有相薄

初始化ALAssetsLibrary對象並使用下面的方法來獲取本地所有相薄

- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock

types 相薄分組類型
ALAssetsGroupType蘋果官方文檔定義如下

   enum {
    ALAssetsGroupLibrary     NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 0),
    // The Library group that includes all assets.
    ALAssetsGroupAlbum       NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 1),
    // All the albums synced from iTunes or created on the device.
    ALAssetsGroupEvent       NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 2),
    // All the events synced from iTunes.
    ALAssetsGroupFaces       NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 3),
    // All the faces albums synced from iTunes.
    ALAssetsGroupSavedPhotos NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 4),
    // The Saved Photos album.
#if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
    ALAssetsGroupPhotoStream NS_ENUM_DEPRECATED_IOS(5_0, 9_0) = (1 << 5),
    // The PhotoStream album.
#endif
    ALAssetsGroupAll         NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = 0xFFFFFFFF,
    // The same as ORing together all the available group types,
};

enumerationBlock 對本地相薄進行遍歷並返回遍歷結果
ALAssetsLibraryGroupsEnumerationResultsBlock定義如下

ALAssetsLibraryGroupsEnumerationResultsBlock resultBlock = ^(ALAssetsGroup *group,BOOL *stop) {};

failureBlock 遍歷失敗
ALAssetsLibraryAccessFailureBlock定義如下

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {};

代碼示例

typedef void (^albumGroupsBlock)(NSMutableArray *groups);
-(void)setupAlbumGroups:(albumGroupsBlock)albumGroups   //獲取所有相薄成功後回調
{
    NSMutableArray *groups = @[].mutableCopy;  //所有相薄數組
    ALAssetsFilter* assstsFilter = [ALAssetsFilter allAssets]; //篩選器獲取所有資源
    ALAssetsLibraryGroupsEnumerationResultsBlock resultBlock = ^(ALAssetsGroup *group, BOOL *stop){           //每次遍歷成功後回調
        if (group) {
            [group setAssetsFilter:assstsFilter];
            NSInteger groupType = [[group valueForProperty:ALAssetsGroupPropertyType] integerValue];
            if (groupType == ALAssetsGroupSavedPhotos) {
                [groups insertObject:group atIndex:0];  //默認相機膠捲放入數組第一位

            }
            else   
            {
                if (group.numberOfAssets>0) {
                    [groups addObject:group];
                }
            }

        }
        else  //當返回的group爲nil表示已經遍歷結束
        {
            if (albumGroups) {
                albumGroups([groups copy]);
            }

        }
    };
    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
        if (albumGroups) {   //遍歷失敗回調
            albumGroups([groups copy]);
        }
    };
    ;
    [[[ALAssetsLibrary alloc] init] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:resultBlock failureBlock:failureBlock];   //開始遍歷
}

獲取本地每個相薄中的資源

初始化ALAssetsGroup對象並使用下面的方法來獲取相薄中的資源

- (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock 

options遍歷相薄中資源的順序
NSEnumerationOptions定義如下

typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
    NSEnumerationConcurrent = (1UL << 0),  // 併發讀取相冊中的資源,順序不確定
    NSEnumerationReverse = (1UL << 1),    //倒序讀取相冊中的資源
};

enumerationBlock對相薄裏資源進行遍歷並返回遍歷結果

ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {};

代碼示例

typedef void (^albumAssetsBlock)(NSMutableArray *assets);
-(void)setupAlbumAssets:(ALAssetsGroup *)group withAssets:(albumAssetsBlock)albumAssets
{
    NSMutableArray *assets = @[].mutableCopy;  //相薄中所有資源數組
    ALAssetsFilter* assstsFilter = [ALAssetsFilter allAssets]; //篩選器獲取所有資源
    [group setAssetsFilter:assstsFilter];   //相冊內資源總數
    NSInteger assetCount = [group numberOfAssets];   //相薄中資源總數
    ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {  //資源爲ALAsset類型對象
        if (asset) {
            [assets addObject:asset];
            NSString *assetType = [asset valueForProperty:ALAssetPropertyType];
            if ([assetType isEqualToString:ALAssetTypePhoto]) {
                //資源類型爲圖片
            }
            else if ([assetType isEqualToString:ALAssetTypeVideo]) {
                //資源類型爲視頻
            }
        }
        else if (assets.count >= assetCount)
        {
            if (albumAssets) {
                albumAssets([assets copy]);
            }

        };
    };
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:resultBlock];
    //開始遍歷相薄中資源
}

實現效果


示例代碼
https://github.com/GGGHub/AlbumPicker

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章