2016-05-23 118 views
7

我正在开发一个iOS应用程序,其中需要像Instagram一样的图库视图。我已添加相册视图,相机视图和视频视图,拍摄后将其保存到相册的自定义相册中。现在我想从自定义相册中检索这些图像并将其显示到图库的“收藏”视图。但是我陷入了从自定义相册中检索这些图像的困境。任何帮助将不胜感激。 Check image for ref.如何从照片,iOS SDK的自定义相册中获取图像?

编辑: 我添加了用于创建自定义相册的PHPhotoLibrary,在此之前我添加了AssetsLibrary框架。

然后,我创建了一个NSObject类(CustomAlbum),用于使用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 

然后用在起飞图片按钮这种方法单击创建自定义相册,并保存图像该自定义相册。

// 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

用相关代码更新您的问题,并解释您在代码中遇到的问题。 – rmaddy

+0

我正在使用PHPhotoLibrary创建自定义相册并保存由相机拍摄的图像。使用此源代码:https://github.com/iBlahji/iOS-CustomPhotoAlbum 但问题是,我如何从这个自定义相册中获取图像并显示与UICollectionView。 – hmjha

+0

@rmaddy plz查看我的代码并向我推荐任何解决方案。谢谢 – hmjha

回答

6

下面是可用的代码。

__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

只是一次尝试这种代码。您可以使用此代码获取的所有图像阵列: -

-(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. 

} 

有关详细信息,请参阅Example app using Photos framework

希望,这就是你要找的。任何担心都会回到我身上。 :)

+0

任何从自定义相册中删除特定图像? –

相关问题