2016-05-23 2 views
7

Ich arbeite an einer iOS-App, in der ich Galerie-Ansicht wie Instagram brauche. Ich habe Galerieansicht, Kameraansicht und Videoansicht hinzugefügt, nachdem ich das Bild gespeichert habe, wird es im benutzerdefinierten Album von Fotos gespeichert. Jetzt möchte ich diese Bilder aus dem benutzerdefinierten Album abrufen und in der Sammlungsansicht der Galerie anzeigen. Aber ich bin dabei, diese Bilder aus dem benutzerdefinierten Album abzurufen. Jede Hilfe wird geschätzt. Check image for ref.Wie bekomme ich Bilder von Custom Album von Fotos, iOS SDK?

Edit: fügte ich die PHPhotoLibrary für individuelle Fotoalbum erstellen, bevor das ich AssetsLibrary Rahmen hinzugefügt.

An Dann erstellte ich eine NSObject-Klasse (CustomAlbum) zum Erstellen und Verwalten des benutzerdefinierten Fotoalbums mit PHPhotoLibrary.

// CustomAlbum.h

#import <Foundation/Foundation.h> 
#import <Photos/Photos.h> 


@interface CustomAlbum : NSObject 

//Creating album with given name 
+(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError; 

//Get the album by name 
+(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName; 

//Add a image 
+(void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError; 

//get the image using identifier 
+ (void)getImageWithIdentifier:(NSString*)imageId onSuccess:(void(^)(UIImage *image))onSuccess onError: (void(^)(NSError * error)) onError; 


@end 

// CustomAlbum.m

#import "CustomAlbum.h" 

@implementation CustomAlbum 

#pragma mark - PHPhoto 

+(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError 
{ 
    //Check weather the album already exist or not 
    if (![self getMyAlbumWithName:title]) { 
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
      // Request editing the album. 
      PHAssetCollectionChangeRequest *createAlbumRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title]; 

      // Get a placeholder for the new asset and add it to the album editing request. 
      PHObjectPlaceholder * placeHolder = [createAlbumRequest placeholderForCreatedAssetCollection]; 
      if (placeHolder) { 
       onSuccess(placeHolder.localIdentifier); 
      } 

     } completionHandler:^(BOOL success, NSError *error) { 
      NSLog(@"Finished adding asset. %@", (success ? @"Success" : error)); 
      if (error) { 
       onError(error); 
      } 
     }]; 
    } 
} 

+(void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError 
{ 
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
     // Request creating an asset from the image. 
     PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

     // Request editing the album. 
     PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album]; 

     // Get a placeholder for the new asset and add it to the album editing request. 
     PHObjectPlaceholder * placeHolder = [createAssetRequest placeholderForCreatedAsset]; 
     [albumChangeRequest addAssets:@[ placeHolder ]]; 

     NSLog(@"%@",placeHolder.localIdentifier); 
     if (placeHolder) { 
      onSuccess(placeHolder.localIdentifier); 
     } 

    } completionHandler:^(BOOL success, NSError *error) { 
     NSLog(@"Finished adding asset. %@", (success ? @"Success" : error)); 
     if (error) { 
      onError(error); 
     } 
    }]; 
} 


+(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName 
{ 
    #if 0 
    NSString * identifier = [[NSUserDefaults standardUserDefaults]objectForKey:kAlbumIdentifier]; 
    if (!identifier) return nil; 
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[identifier] 
                          options:nil]; 
    #else 
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum 
                       subtype:PHAssetCollectionSubtypeAlbumRegular 
                       options:nil]; 
    #endif 
    NSLog(@"assetCollections.count = %lu", assetCollections.count); 
    if (assetCollections.count == 0) return nil; 

    __block PHAssetCollection * myAlbum; 
    [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *album, NSUInteger idx, BOOL *stop) { 
     NSLog(@"album:%@", album); 
     NSLog(@"album.localizedTitle:%@", album.localizedTitle); 
     if ([album.localizedTitle isEqualToString:AlbumName]) { 
      myAlbum = album; 
      *stop = YES; 
     } 
    }]; 

    if (!myAlbum) return nil; 
    return myAlbum; 
} 

+(NSArray *)getAssets:(PHFetchResult *)fetch 
{ 
    __block NSMutableArray * assetArray = NSMutableArray.new; 
    [fetch enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { 
     NSLog(@"asset:%@", asset); 
     [assetArray addObject:asset]; 
    }]; 
    return assetArray; 
} 



+ (void)getImageWithIdentifier:(NSString*)imageId onSuccess:(void(^)(UIImage *image))onSuccess onError: (void(^)(NSError * error)) onError 
{ 
    NSError *error = [[NSError alloc] init]; 
    PHFetchResult *assets = [PHAsset fetchAssetsWithLocalIdentifiers:@[imageId] options:nil]; 
    if (assets.count == 0) onError(error); 

    NSArray * assetArray = [self getAssets:assets]; 
    PHImageManager *manager = [PHImageManager defaultManager]; 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    [manager requestImageForAsset:assetArray.firstObject targetSize:screenRect.size contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { 
     onSuccess(result); 
    }]; 
} 

@end 

Und dann diese Methode auf take Bildschaltfläche verwenden auf CUSTOM Album erstellen und speichern Bilder in das benutzerdefinierte Album.

// Take Image Button Method 

- (void)snapButtonPressed:(UIButton *)button 
{ 
    [self.camera capture:^(LLSimpleCamera *camera, UIImage *image, 
          NSDictionary *metadata, NSError *error) 
    { 
     if(!error) 
     { 
      NSString * info = [NSString stringWithFormat:@"Size: %@ - Orientation: %ld", NSStringFromCGSize(image.size), (long)image.imageOrientation]; 

      [CustomAlbum addNewAssetWithImage:image toAlbum:[CustomAlbum getMyAlbumWithName:CSAlbum] onSuccess:^(NSString *ImageId) { 
       NSLog(@"%@",ImageId); 
       recentImg = ImageId; 
      } onError:^(NSError *error) { 
       NSLog(@"probelm in saving image"); 
      }]; 
     } 
     else 
     { 
      NSLog(@"An error has occured: %@", error); 
     } 
    } 
      exactSeenImage:YES]; 
} 
+0

Aktualisieren Sie Ihre Frage mit relevanten Code und erklären Sie, welche Probleme Sie mit dem Code haben. – rmaddy

+0

Ich verwende PHPhotoLibrary, um ein benutzerdefiniertes Album zu erstellen und Bilder zu speichern, die von der Kamera aufgenommen wurden. Mit diesem Quellcode: https://github.com/iBlahji/iOS-CustomPhotoAlbum Aber Problem ist, dass, wie kann ich Bilder von diesem benutzerdefinierten Album und zeigen mit UICollectionView. – hmjha

+0

@rmaddy PLZ überprüfen Sie meinen Code und schlagen Sie mir eine Lösung vor. danke – hmjha

Antwort

6

Hier ist der Code, der funktioniert.

__block PHAssetCollection *collection; 

// Find the album 
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; 
fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", @"YOUR_CUSTOM_ALBUM_NAME"]; 
collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum 
                subtype:PHAssetCollectionSubtypeAny 
                options:fetchOptions].firstObject; 

PHFetchResult *collectionResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil]; 

[collectionResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { 


    //add assets to an array for later use in the uicollectionviewcell 

}]; 
4

Versuchen Sie einfach einmal diesen Code .. Sie können alle Bilder in einem Array erhalten Sie diesen Code verwenden: -

-(void)getAllPictures 
{ 

    __block PHAssetCollection *collection; 

    // Find the album 
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; 
    fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", @"YOUR_CUSTOM_ALBUM_NAME"]; 
    collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum 
                  subtype:PHAssetCollectionSubtypeAny 
                  options:fetchOptions].firstObject; 

    PHFetchResult *collectionResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil]; 

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

    [collectionResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { 
     [assets addObject:asset]; 

    }]; 

    PHImageRequestOptions * requestOptions = [[PHImageRequestOptions alloc] init]; 
    //requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact; 
    //requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; 

    // this one is key 
    //requestOptions.synchronous = true; 


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

    // assets contains PHAsset objects. 
    __block UIImage *ima; 

    for (PHAsset *asset in assets) { 
     // Do something with the asset 

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

          [images addObject:ima]; 
         }]; 
    } 

    NSLog(@"images %@", images); //You will get all images into this images array. 

} 

Für weitere Informationen, lesen Sie bitte Example app using Photos framework.

Hoffe, das ist, was Sie suchen. Jede Sorge komme zu mir zurück. :)

+0

Anything for delete bestimmtes Bild von benutzerdefinierten Album? –

Verwandte Themen