Изменение размеров ячеек 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:
для загруженных ячеек.