Как я могу получить альбом Moment и все личные альбомы в моем collectionView?

Я пытаюсь использовать Photos Framework, В моем collectionViewЯ хотел бы показать изображение плаката Camera Roll а также Personal albums,

Я пытаюсь реализовать код таким образом, но я все еще вижу одно и то же изображение для каждого альбома... где я делаю неправильно?

Здесь я размещаю свой код... Я надеюсь, что кто-то может мне помочь

//USER ALBUM
@property (nonatomic, strong) PHFetchResult *userAlbum;
@property (nonatomic, strong) PHAssetCollection *assetCollection;
@property (nonatomic, strong) PHAsset *asset;


-(void)viewDidLoad {
    [super viewDidLoad];

    PHFetchOptions *userAlbumsOptions = [[PHFetchOptions alloc] init];
    userAlbumsOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

    self.userAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum | PHAssetCollectionTypeMoment  subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    for (NSInteger i =0; i < self.userAlbum.count; i++) {
        self.assetCollection = [self.userAlbum objectAtIndex:i];
        NSLog(@"%@",[self.assetCollection.localizedTitle uppercaseString]);

        PHFetchResult *fetchResult = [PHAsset fetchKeyAssetsInAssetCollection:self.assetCollection options:nil];
        self.asset = [fetchResult firstObject];
 }
}

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


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath {

        KCCategoryCell *catCell = [collectionView dequeueReusableCellWithReuseIdentifier:categoryCellID forIndexPath:indexPath];

        CGFloat retina = [UIScreen mainScreen].scale;
        CGSize square = CGSizeMake(catCell.albumImage.bounds.size.width * retina, catCell.bounds.size.height * retina);

        [[PHImageManager defaultManager] requestImageForAsset:self.asset targetSize:square  contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
                catCell.albumImage.image = result;
        }];

        return catCell;
}

1 ответ

Решение

Причина, по которой вы видите одно и то же изображение, заключается в том, что вы запрашиваете один и тот же ресурс для всех ваших индексов:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath {

    KCCategoryCell *catCell = [collectionView dequeueReusableCellWithReuseIdentifier:categoryCellID forIndexPath:indexPath];

    CGFloat retina = [UIScreen mainScreen].scale;
    CGSize square = CGSizeMake(catCell.albumImage.bounds.size.width * retina, catCell.bounds.size.height * retina);

    [[PHImageManager defaultManager] requestImageForAsset:self.asset // <-- Right here
                                               targetSize:square  contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        catCell.albumImage.image = result;
    }];

    return catCell;
}

Так что вместо этого сделайте это:

1) Изменить @property (nonatomic, strong) PHAsset *asset; в @property (nonatomic, strong) PHFetchResult *assets;

2) Вместо этого:

PHFetchResult *fetchResult = [PHAsset fetchKeyAssetsInAssetCollection:self.assetCollection options:nil];
self.asset = [fetchResult firstObject];

Сделай это:

self.assets = [PHAsset fetchKeyAssetsInAssetCollection:self.assetCollection options:nil];

3) Наконец, вместо этого:

[[PHImageManager defaultManager] requestImageForAsset:self.asset
                                           targetSize:square contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
   catCell.albumImage.image = result;
}];

Сделай это:

[[PHImageManager defaultManager] requestImageForAsset:self.assets[indexPath.row]
                                           targetSize:square contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
   catCell.albumImage.image = result;
}];

Подведем итог:

Вы получаете то же изображение (self.asset) снова и снова, для всех клеток. Поэтому вместо этого создайте свойство для всех активов и извлеките правильный актив для нужной ячейки.

Другие вопросы по тегам