0

I'm having a problem to display an ALAssets list from the device Gallery in each item of a collectionViewCell.

My images are not visible in the collection view. I tried all the solutions that I found in the relatives posts, but I didn't found the answer... Why?

Here is my dev environment :

iPhone5, IOS 6.0.2, XCode 4.5, using ARC & storyboards.

And here is my code :

1. First, I fetch the MutableArray with device media in my delegate :

#AppDelegate.m

 -(void)loadPhotosFromDevice
 {
    //deviceMedia = [[NSMutableArray alloc] init];
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

    // Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos     usingBlock:^(ALAssetsGroup *group, BOOL *stop)
         {
             // Within the group enumeration block, filter if necessary
             [group setAssetsFilter:[ALAssetsFilter allPhotos]];
             [group enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index,     BOOL *innerStop)
              {
                  // The end of the enumeration is signaled by asset == nil.
                  if (alAsset)
                  {
                      ALAssetRepresentation *representation = [alAsset defaultRepresentation];

                      [self addPhoto:representation andAsset:alAsset];
                  }
                  else
                  {
                      //NSLog(@"Done! Count = %d", deviceMedia.count);
                      //Do something awesome
                  }
              }];
         }
                             failureBlock: ^(NSError *error) {
                                 // Typically you should handle an error more gracefully than this.
                                 NSLog(@"No groups");
                             }];
    }
}

2. I send all my datas with "AddPhoto" Method in an "Media" object class :

#AppDelegate.m

    -(void)addPhoto:(ALAssetRepresentation *)asset andAsset:alAsset
    {
    //NSLog(@"Adding photo!");

    Media *media = [[Media alloc] init];
    media.baseurl = @"";
    media.url = [asset.url absoluteString];

    Thumbnail *t = [[Thumbnail alloc] init];
    t.rep = asset;
    t.url = [asset.url absoluteString];

    media.thumbnails = [[Thumbnail alloc] initWithRepresentation:asset];
    media.name = asset.filename;
    media.asset = alAsset;
    media.isFromDevice = YES;
    [getPhotos addObject:media];
    NSLog(@"\nDevice Photo added array");
    }

#Media.h

 import <AssetsLibrary/AssetsLibrary.h>

 @interface Media : NSObject
 {
    //General
    AudioInfo *audioInfo;
    Info *info;
    Header *header;
    Status *requestStatus;
    Exif *exif;
    Thumbnail *thumbnails;
    NSString *name;
    NSString *uploaddt;
    NSString *baseurl;
    NSString *url;
    NSString *createdt;
    NSString *takendt;
    NSString *recorddt;
    ALAsset *asset;
    bool isFromDevice;
}
//General

    @property (nonatomic, retain) Thumbnail *thumbnails;
    @property (nonatomic, retain) Status *requestStatus;
    @property (nonatomic, retain) NSString *name;
    @property (nonatomic, retain) NSString *uploaddt;
    @property (nonatomic, retain) NSString *baseurl;
    @property (nonatomic, retain) NSString *url;
    @property (nonatomic, retain) NSString *createdt;
    @property (nonatomic, retain) NSString *takendt;
    @property (nonatomic, retain) NSString *recorddt;
    @property (nonatomic, retain) ALAsset *asset;
    @property (nonatomic, readwrite) bool isFromDevice;

@end

3. Then I display them in a CollectionViewController :

#PhotoDisplayCloudViewController

@implementation PhotoDisplayCloudViewController

- (void)viewDidLoad {
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    tableau = appDelegate.getPhotos;
    [super viewDidLoad];
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return tableau.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    //CELL
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    Media *object = [[Media alloc] init];
    object = [tableau objectAtIndex:indexPath.row];

    //IMAGE
    NSString *url = [NSString stringWithFormat:@"%@%@", object.baseurl, object.thumbnails.url];
    NSLog(@"%@ start loading", object.name);
    UIImageView *image = [[UIImageView alloc] init];
    if (object.isFromDevice)
    {    
        image = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage :[object.asset.self thumbnail]]];          
    }
    else
    {
        image = [[UIImageView alloc] initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: url]]]];
    } 
    [image setFrame:CGRectMake(image.frame.origin.x, image.frame.origin.y, 72, 72)];

    //LABEL
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(image.frame.origin.x+6, image.frame.origin.y+58, 60, 12)];
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = UIColor.blackColor;
    label.contentMode = UIViewContentModeBottom;
    label.font = [UIFont fontWithName:@"Times New Roman" size:9];
    label.text = object.name;

    //ADD VIEWS

    [cell addSubview:image];
    [cell addSubview:label];
    NSLog(@"%@ end loading", object.name);

    return cell;
}

- (void)didGrabImage:(UIImage *)image {
    [collectionCell addSubview:image];
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    PhotoDetailViewController *photoDetailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"photoDetail"];
    photoDetailViewController.MaPhoto=[tableau objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:photoDetailViewController animated:YES];

} 
@end

Please answer me clearly ^^

Advance thx !

user1903839
  • 19
  • 1
  • 3
  • You don't seem to have asked a question about Xcode. Why is this tagged Xcode then? –  Jan 11 '13 at 17:21
  • I'm using XCode to develop this project, that's why I tagged it with XCode. Sorry if it's not usual... – user1903839 Jan 14 '13 at 08:06

1 Answers1

1

I found an answer to my problem :

thanks to "adaydesign's blog" , I used this method to load my assets into the UIImageView :

It works perfectly !

-(void)loadPhotoFromURL:(NSURL*)imgURL thumbnail:(BOOL)useThumbnail showIn:(UIImageView*)imView{

     if (imgURL!=nil) {

        ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset *myasset){

             CGImageRef iref;

             if (useThumbnail) {

                 iref = [myasset thumbnail];

             }else {

                 ALAssetRepresentation *rep = [myasset defaultRepresentation];

                 iref = [rep fullScreenImage];

             }

             if (iref) {

                 UIImage *resPhoto = [UIImage imageWithCGImage:iref];

                     //NSLog(@"photo size:%f x %f",resPhoto.size.width,resPhoto.size.height);

                 imView.image = resPhoto;

              }

        };//end result block


        ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){

            NSLog(@"error....");

        };//end failureBlock


        ALAssetsLibrary *assetLib = [[[ALAssetsLibrary alloc] init] autorelease];

        [assetLib assetForURL:imgURL

                  resultBlock:resultBlock

                 failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock];

      }//end if

}//end function
user1903839
  • 19
  • 1
  • 3
  • just do a change for fast performance.do the UIStuffs in main thread dispatch_async(dispatch_get_global_queue(0, 0), ^{ imView.image = resPhoto; }); please check my answer for details http://stackoverflow.com/questions/13508535/add-uiimageview-into-uiscrollview-inside-block-with-alasset/13508841#13508841 – Shamsudheen TK Feb 11 '13 at 02:51