アプリ開発記 AlAssetLibraryを使ってサムネイルを取得してテーブルに表示


ALAssetLibraryってBlocksゴリゴリで見かけが怖いけどわかってくると便利ですね。

-(NSMutableArray*)getcameraroll{
    NSMutableArray *imageArray =[[NSMutableArray alloc] init];
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                                 usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                                     if (nil != group) {
                                         // be sure to filter the group so you only get photos
                                         [group setAssetsFilter:[ALAssetsFilter allPhotos]];
                                         [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
                                          {
                                              if (asset)
                                              {
                                                  [imageArray addObject:[UIImage imageWithCGImage: asset.thumbnail]];
                                              }
                                          }];
                                     }
                                     *stop = NO;
                                 } failureBlock:^(NSError *error) {
                                     NSLog(@"error: %@", error);
                                 }];
    return imageArray;
}

メソッド名が適当すぎてあれですが。(ノω・)テヘ

Assetを取得してそこからサムネイルのCGImageRefが取得できるのでそれをUIImageに変換して配列に突っ込んでます。

あとはこの配列でテーブルビューを作る。

別な方法としてAssetからrepresentationを取得してそこからurlを取得しておいてアクセスする方法もアリかもしれません。

ここのページが参考になるかも。

ALAssetsLibraryについて – TorasenLab@はてな

というかメモリ的にはソッチのほうが劇的に優しそうです、でも表示的にはサムネイルを持っておくほうが高速なのかも。

失敗談

NSMutableArrayをalloc initし忘れに気付かず配列にオブジェクトが追加されなくてBlockのせいじゃないかと悩むこと10分。そりゃ配列が出来てなきゃ追加なんてできないよね。さーせん。

CGImageRefからUIImageへの変換部分は前にも使ったのですが忘れててCGImageRefになんかメッセージを送ってUIImageが取れるみたいな勘違いをしてました。

ここで解決(質問の意図と僕の要求はズレてますが)
iphone – UIImage created from CGImageRef fails with UIImagePNGRepresentation – Stack Overflow

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です