0

collectionViewCell の各アイテムのデバイス ギャラリーから ALAssets リストを表示する際に問題が発生しています。

コレクション ビューに自分の画像が表示されません。親族の投稿で見つけたすべての解決策を試しましたが、答えが見つかりませんでした.なぜですか?

ここに私の開発環境があります:

iPhone5、IOS 6.0.2、XCode 4.5、ARC とストーリーボードを使用。

そして、ここに私のコードがあります:

1. まず、デリゲートでデバイス メディアを使用して MutableArray をフェッチします。

#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. 「Media」オブジェクト クラスの「AddPhoto」メソッドを使用してすべてのデータを送信します。

#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. 次に、それらを 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

分かりやすくお答えください^^

前進thx!

4

1 に答える 1

1

私の問題に対する答えを見つけました:

「adaydesign のブログ」のおかげで、このメソッドを使用してアセットを UIImageView にロードしました。

それは完璧に動作します!

-(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
于 2013-01-14T09:39:46.340 に答える