2012年12月08日

ALAssetsLibraryを使う(2)

ALAssetsLibraryを使う(1)の内容をまとめたソースコードになります。ストーリーボード上でUIButtonを配置し、ボタンをタップしたら、UIImagePickerControllerを表示させる想定になります。


アルバムに写真を追加する( iOS5以降 ) ソースコード

● AssetViewController.h

ALAssetsLibraryを使う(1)で説明したものの他に、アルバムが写真アプリに既にあるかどうかの判定を保持する_albumWasFoundを作成します。

#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>

@interface AssetViewController : UIViewController
    <UINavigationControllerDelegate, UIImagePickerControllerDelegate>{
{
    //StoryBoardに配置したボタン
    IBOutlet UIButton *_button;

    UIImagePickerController *_pickerController;
    
    ALAssetsLibrary *_library;
    NSURL *_groupURL;
    NSString *_AlbumName;
    
    //アルバムが写真アプリに既にあるかどうかの判定用
    BOOL _albumWasFound;
}

@end

● AssetViewController.m

viewDidLoadで写真アプリにアルバムがあるかどうかを判定し、なければアルバムを新規作成します。その他は、ALAssetsLibraryを使う(1)をまとめた内容になります。


#import "AssetViewController.h"

@implementation AssetViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //UIImagePickerController
    _pickerController =[[UIImagePickerController alloc] init];
    _pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    _pickerController.delegate = self;
    _pickerController.allowsEditing = YES;
    
    //ボタン設定
    [_button addTarget:self action:@selector(buttonDidPused:) forControlEvents:UIControlEventTouchDown];
    
    //ALAssetLibraryのインスタン作成
    _library = [[ALAssetsLibrary alloc] init];
    _AlbumName = @"myPhotoAlbum";
    _albumWasFound = FALSE;
    
    //アルバムを検索してなかったら新規作成、あったらアルバムのURLを保持
    [_library enumerateGroupsWithTypes:ALAssetsGroupAlbum
        usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                                
            if (group) {
                                    
                if ([_AlbumName compare:[group valueForProperty:ALAssetsGroupPropertyName]] == NSOrderedSame) {

                    //URLをクラスインスタンスに保持      
                    _groupURL = [group valueForProperty:ALAssetsGroupPropertyURL];
                    _albumWasFound = TRUE;
                                        
                 //アルバムがない場合は新規作成
                }else if (_albumWasFound==FALSE) {
                                        
                    ALAssetsLibraryGroupResultBlock resultBlock = ^(ALAssetsGroup *group) {
                        _groupURL = [group valueForProperty:ALAssetsGroupPropertyURL];
                    };
                                        
                    //新しいアルバムを作成
                    [_library addAssetsGroupAlbumWithName:_AlbumName
                        resultBlock:resultBlock
                        failureBlock: nil];

                    _albumWasFound = TRUE;
                }
            }
                                
    } failureBlock:nil];
}

//ボタンが押されたらUIImagePickerControllerを表示させる
- (void)buttonDidPused:(UIButton *)button
{
    [self presentModalViewController:_pickerController animated:YES];
}

//写真選択時に呼ばれるデリゲートメソッド
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
    
    //カメラロールにUIImageを保存する。保存完了後、completionBlockで「NSURL* assetURL」が取得できる
    [_library writeImageToSavedPhotosAlbum:image.CGImage orientation:(ALAssetOrientation)image.imageOrientation
        completionBlock:^(NSURL* assetURL, NSError* error) {
                              
            //アルバムにALAssetを追加するメソッド
            [self addAssetURL:assetURL
                AlbumURL:_groupURL];
            }];
    
    [self dismissModalViewControllerAnimated:YES];
}

//アルバムにALAssetを追加するメソッド
- (void)addAssetURL:(NSURL*)assetURL AlbumURL:(NSURL *)albumURL{

    //URLからGroupを取得
    [_library groupForURL:albumURL
        resultBlock:^(ALAssetsGroup *group){
                 
        //URLからALAssetを取得
        [_library assetForURL:assetURL
            resultBlock:^(ALAsset *asset) {

                if (group.editable) { 
                    //GroupにAssetを追加
                    [group addAsset:asset];
                }
                              
            } failureBlock: nil];
        } failureBlock:nil];
}

@end

● ALAssetGroupのeditableプロパティについて

ALAssetGroupにeditableプロパティがありますが、editableがTRUEでないと、「addAsset:」することができません。しかも、写真アプリで何かしらの変更があると、すぐにeditableがFALSEになり、しばらくたたないとTRUEにならないので、注意が必要です。
そのためALAssetsLibraryChangedNotificationといった通知の仕組みが用意されているようです。

  • このエントリーをはてなブックマークに追加
前の記事へ

ALAssetsLibraryを使う(1)

次の記事へ

ALAssetsLibraryを使う(3)