Изменение размеров ячеек UICollectionView после загрузки изображения внутри

Я создаю UICollectionView, и мои пользовательские ячейки будут содержать две метки и одно изображение.

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

Как UICollectionViewLayout, я использую CHTCollectionViewWaterfallLayout

Чтобы загрузить изображение асинхронно, я использую SDWebImage, например:

    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) 
                                {... some completion code here ...}];

Вопрос:

Каков правильный подход к изменению размера каждого UICollectionViewCell сразу после загрузки изображения?

Ответ 1

Вы должны просто иметь возможность аннулировать макет вида коллекций в блоке анимации, когда изображение возвращается. Все может немного усложниться, если сразу несколько изображений заканчиваются, но это должно работать:

[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
               placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                      completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)^{
                          [UIView animateWithDuration:0.3f animations:^{
                              [self.collectionView.collectionViewLayout invalidateLayout];
                          }];
                      }];

Затем просто верните другой размер в соответствующем методе делегата.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return /* a different size if the image is done downloading yet */;
}

Ответ 2

Чтобы изменить размер ячеек просмотра коллекции, вы можете перезагрузить представление коллекции и динамически вернуть размер ячеек просмотра коллекции в методе:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    return [cell size];
}

В случаях, когда размер ячейки является динамическим, получите ячейку из указательного пути и верните ее размер в зависимости от размера изображения. Обычно я создаю метод для того, чтобы ячейка возвращала динамический размер, как в приведенном выше примере. Вы можете использовать свойство размера UIImage, чтобы вернуть размер на основе изображения.

Ответ 3

Вы можете попробовать reloadItemsAtIndexPaths: для загруженных ячеек.