2012-09-28 3 views

Respuesta

29

// cabecera Vista Controlador archivo (.h) ..

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

@interface getPhotoLibViewController : UIViewController 
{ 
ALAssetsLibrary *library; 
NSArray *imageArray; 
NSMutableArray *mutableArray; 
} 

-(void)allPhotosCollected:(NSArray*)imgArray; 

@end 

// aplicación archivo

declaran variable de recuento global como

método
static int count=0; 

@implementation getPhotoLibViewController 

-(void)getAllPictures 
{ 
imageArray=[[NSArray alloc] init]; 
mutableArray =[[NSMutableArray alloc]init]; 
NSMutableArray* assetURLDictionaries = [[NSMutableArray alloc] init]; 

library = [[ALAssetsLibrary alloc] init]; 

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) { 
    if(result != nil) { 
    if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { 
    [assetURLDictionaries addObject:[result valueForProperty:ALAssetPropertyURLs]]; 

    NSURL *url= (NSURL*) [[result defaultRepresentation]url]; 

    [library assetForURL:url 
      resultBlock:^(ALAsset *asset) { 
       [mutableArray addObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]]]; 

       if ([mutableArray count]==count) 
       { 
       imageArray=[[NSArray alloc] initWithArray:mutableArray]; 
       [self allPhotosCollected:imageArray]; 
       } 
      } 
      failureBlock:^(NSError *error){ NSLog(@"operation was not successfull!"); } ]; 

    } 
    } 
}; 

NSMutableArray *assetGroups = [[NSMutableArray alloc] init]; 

void (^ assetGroupEnumerator) (ALAssetsGroup *, BOOL *)= ^(ALAssetsGroup *group, BOOL *stop) { 
    if(group != nil) { 
    [group enumerateAssetsUsingBlock:assetEnumerator]; 
    [assetGroups addObject:group]; 
    count=[group numberOfAssets]; 
    } 
}; 

assetGroups = [[NSMutableArray alloc] init]; 

[library enumerateGroupsWithTypes:ALAssetsGroupAll 
         usingBlock:assetGroupEnumerator 
         failureBlock:^(NSError *error) {NSLog(@"There is an error");}]; 
} 

-(void)allPhotosCollected:(NSArray*)imgArray 
{ 
//write your code here after getting all the photos from library... 
NSLog(@"all pictures are %@",imgArray); 
} 

@end 

Uso getAllPicture para obtener fotos de librería fotográfica.

O bien, puede echar un vistazo a este blog http://mutiselectimagepicker.blogspot.in/2014/08/imageselect-to-allow-multiple-selection.html

+1

¡La huella de memoria del enfoque anterior es tremenda! Aunque es una forma muy fácil y sencilla de hacerlo. La administración de la memoria específicamente se vuelve difícil debido al uso de un bloque asíncrono. –

+1

Da error, si usamos "# include " así que tenga esto en su cabecera a removedor de los errores: import ayuda: http : //stackoverflow.com/questions/10342931/alasset-valueforpropertyalassetpropertylocation-undeclared –

+0

importación import durante más vienen este error: tipo de receptor 'ALAssetRepresentation' para el mensaje de instancia es una declaración adelantada –

0

-(void)getFromGallery:(BOOL)IsImages 
 
{ 
 
    if(self.csCollectionsArray != nil) 
 
     [self.csCollectionsArray removeAllObjects]; 
 
    __block NSMutableDictionary *date = [[NSMutableDictionary alloc] init]; 
 
    ALAssetsLibrary *csAssetsLibrary = [[ALAssetsLibrary alloc] init]; 
 
    NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces | ALAssetsGroupSavedPhotos; 
 
    [csAssetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
 
    { 
 
     if([group numberOfAssets] > 0) 
 
     { 
 
      if(IsImages) 
 
       [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
 
      else 
 
       [group setAssetsFilter:[ALAssetsFilter allVideos]]; 
 
      [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) 
 
      { 
 
       if(asset) 
 
       { //1.fetching all assets from device library 
 
        //2.Add all fetched assests from library 
 
        [date setObject:asset forKey:[asset valueForProperty:ALAssetPropertyDate]]; 
 
       } 
 
      }]; 
 
     } 
 
     else 
 
     { NSLog(@"---> load table -------->"); 
 
      if(date != nil && date.count > 0) 
 
      { //3.Sort using date by ascending order and moved to dictionary to array 
 
       NSArray *sortedKeys = [[date allKeys] sortedArrayUsingSelector: @selector(compare:)]; 
 
       for (NSString *key in sortedKeys) 
 
        [self.csCollectionsArray addObject: [date objectForKey:key]]; 
 
       //4.Load images into collection view after fetching all datas 
 
       [self reloadCollectionView]; 
 
       if(self.csCollectionView != nil) 
 
        [self.csCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:([self.csCollectionsArray count] - 1) inSection:0] atScrollPosition:UICollectionViewScrollPositionBottom animated:YES]; 
 
      } 
 
      date = nil; 
 
     } 
 
    }failureBlock:^(NSError *error) 
 
    { 
 
     if((csCollectionsArray == nil || [csCollectionsArray count] == 0)) 
 
     { 
 
      ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; if(status != ALAuthorizationStatusAuthorized) 
 
      { 
 
       [self showAlertAndCloseUploaderView:@"You can just go to \"Settings\" app (General -> Reset -> Reset Location & Privacy) then come again and click ok when the alert dialog is showing for enable the permission to access the photo library"]; 
 
      } 
 
     } 
 
    }]; 
 
}

Puede utilizar este método de abajo a buscar todas las imágenes o vídeos desde la biblioteca de activos en ios. uso de este marco assetslibrary (mosto) NOTA: - import

-(void)getFromGallery:(BOOL)IsImages 
{ 
    if(self.csCollectionsArray != nil) 
     [self.csCollectionsArray removeAllObjects]; 
    __block NSMutableDictionary *date = [[NSMutableDictionary alloc] init]; 
    ALAssetsLibrary *csAssetsLibrary = [[ALAssetsLibrary alloc] init]; 
    NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces | ALAssetsGroupSavedPhotos; 
    [csAssetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if([group numberOfAssets] > 0) 
     { 
      if(IsImages) 
       [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
      else 
       [group setAssetsFilter:[ALAssetsFilter allVideos]]; 
      [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) 
      { 
       if(asset) 
       { //1.fetching all assets from device library 
        //2.Add all fetched assests from library 
        [date setObject:asset forKey:[asset valueForProperty:ALAssetPropertyDate]]; 
       } 
      }]; 
     } 
     else 
     { NSLog(@"---> load table -------->"); 
      if(date != nil && date.count > 0) 
      { //3.Sort using date by ascending order and moved to dictionary to array 
       NSArray *sortedKeys = [[date allKeys] sortedArrayUsingSelector: @selector(compare:)]; 
       for (NSString *key in sortedKeys) 
        [self.csCollectionsArray addObject: [date objectForKey:key]]; 
       //4.Load images into collection view after fetching all datas 
       [self reloadCollectionView]; 
       if(self.csCollectionView != nil) 
        [self.csCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:([self.csCollectionsArray count] - 1) inSection:0] atScrollPosition:UICollectionViewScrollPositionBottom animated:YES]; 
      } 
      date = nil; 
     } 
    }failureBlock:^(NSError *error) 
    { 
     if((csCollectionsArray == nil || [csCollectionsArray count] == 0)) 
     { 
      ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; if(status != ALAuthorizationStatusAuthorized) 
      { 
       [self showAlertAndCloseUploaderView:@"You can just go to \"Settings\" app (General -> Reset -> Reset Location & Privacy) then come again and click ok when the alert dialog is showing for enable the permission to access the photo library"]; 
      } 
     } 
    }]; 
} 
6

Desde ALAssetsLibrary es obsoleto y ahora Photo Framework es nueva. Hice mi propia función en Objective C para obtener todas las fotos de cámara de rollo y almacenar en NSArray y exhibidas en mi CollectionView

NSArray *imageArray; 
NSMutableArray *mutableArray; 

-(void)getAllPhotosFromCamera 
{ 
    imageArray=[[NSArray alloc] init]; 
    mutableArray =[[NSMutableArray 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:[result count]]; 

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


    } 

    imageArray = [images copy]; // You can direct use NSMutuable Array images 
} 
Cuestiones relacionadas