2016-05-23 17 views
7

Tôi đang làm việc trên ứng dụng iOS, trong đó tôi cần chế độ xem thư viện như Instagram. Tôi đã thêm thư viện Xem, camera Xem và xem video, sau khi chụp ảnh nó sẽ lưu vào album tùy chỉnh Ảnh. Bây giờ tôi muốn truy xuất những hình ảnh đó từ album tùy chỉnh và hiển thị nó vào chế độ xem Bộ sưu tập của Bộ sưu tập. Nhưng tôi đang gặp khó khăn trong việc lấy những hình ảnh đó từ album tùy chỉnh. Bất kỳ trợ giúp sẽ được đánh giá cao. Check image for ref.Cách tải hình ảnh từ Anbom tùy chỉnh Ảnh, SDK iOS?

Chỉnh sửa: Tôi đã thêm PHPhotoLibrary để tạo album ảnh tùy chỉnh, trước khi tôi thêm khung AssetsLibrary.

An Sau đó, tôi đã tạo một lớp NSObject (CustomAlbum) để tạo và quản lý album ảnh tùy chỉnh bằng 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 

Và sau đó sử dụng phương pháp này trên mất Nút hình ảnh bấm vào để tạo album tùy chỉnh và lưu hình ảnh trong album tùy chỉnh đó.

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

Cập nhật câu hỏi của bạn bằng mã có liên quan và giải thích những vấn đề bạn đang gặp phải với mã. – rmaddy

+0

Tôi đang sử dụng PHPhotoLibrary để tạo album tùy chỉnh và lưu hình ảnh được chụp bằng camera. Sử dụng mã nguồn này: https://github.com/iBlahji/iOS-CustomPhotoAlbum Nhưng vấn đề là, làm cách nào để có được hình ảnh từ album tùy chỉnh này và hiển thị với UICollectionView. – hmjha

+0

@rmaddy plz xem xét mã của tôi và đề xuất cho tôi bất kỳ giải pháp nào. thanks – hmjha

Trả lời

6

Đây là mã hoạt động.

__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

Chỉ cần cố gắng một lần mã này .. Bạn có thể nhận được tất cả hình ảnh trong một mảng sử dụng mã này: -

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

} 

Để biết thêm chi tiết, xin vui lòng tham khảo Example app using Photos framework.

Hy vọng, đây là những gì bạn đang tìm kiếm. Bất kỳ mối quan tâm nào đều quay trở lại với tôi. :)

+0

Mọi thứ để xóa hình ảnh cụ thể khỏi album tùy chỉnh? –

Các vấn đề liên quan