UICollectionView добавление изображения в ячейку

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

Способ, которым я использую, – проверить, не является ли URL-адрес изображения нулевым, а затем добавить ImageView в ячейку.

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { if (question.picture != (id)[NSNull null]) { //add AsyncImageView to cell imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; imageView.tag = IMAGE_VIEW_TAG; [cell addSubview:imageView]; [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView]; imageView.imageURL = [NSURL URLWithString:question.picture]; } } 

Для тех ячеек, у которых нет изображения, ячейка должна выглядеть так: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/good.png

Тем не менее, некоторые из них по-прежнему будут добавлять ImageView с обрезанным изображением на нем, вызывая что-то вроде этого: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/bad.png

Я попытался использовать SDWebImage, но все еще не решил проблему.

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

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

One Solution collect form web for “UICollectionView добавление изображения в ячейку”

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

  • Первый способ (хороший способ): вы подклассифицируете свой UICollectionViewCell и придаете подклассу свойство «imageView». Затем вы делаете это в своем файле CustomCollectionViewCell.m:

     // Lazy loading of the imageView - (UIImageView *) imageView { if (!_imageView) { _imageView = [[UIImageView alloc] initWithFrame:self.contentView.bounds]; [self.contentView addSubview:_imageView]; } return _imageView; } // Here we remove all the custom stuff that we added to our subclassed cell -(void)prepareForReuse { [super prepareForReuse]; [self.imageView removeFromSuperview]; self.imageView = nil; } 

    Затем в вашем ViewController вам необходимо объявить новый класс вашей коллекцииViewCells следующим образом:

     [self.collectionView registerClass:[CustomCollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; 

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

  • Второй способ (грязный путь), вы удаляете представления каждый раз, когда вы загружаете новую ячейку:

     - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { for (UIView *subview in [cell.contentView subviews]) { [subview removeFromSuperview]; } if (question.picture != (id)[NSNull null]) { //add AsyncImageView to cell imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; imageView.tag = IMAGE_VIEW_TAG; [cell.contentView addSubview:imageView]; [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView]; imageView.imageURL = [NSURL URLWithString:question.picture]; } } 

    Этот путь намного проще, но я бы не рекомендовал его: P

Теперь попробуйте это и дайте мне знать, как развивается ваша ошибка.

  • Как получить режим смешанного смешивания на простом UIView (не UIImage)
  • Задачи и роли пользовательского класса Objective-C
  • Получение сохраненного видео из каталога документов для просмотра в iOS
  • UIView overriding drawRect заставляет просмотр не подчиняться маскамToBounds
  • Невозможно увидеть subview внутри UIScrollView через программные ограничения
  • iOS UIView получить кадр после вращения
  • drawRect и addSubview: пользовательский рисунок влияет на какие виды?
  • UIView vs Container View
  • swift uiview не имеет члена с именем center
  • Как остановить UIView CABasicAnimation в iPhone
  • Круглые углы в UIView: CALayer или фоновое изображение?
  • Interesting Posts

    AudioFileReadPackets устарел в iOS8

    Можно ли получить текущую дату HTTP-потока, который воспроизводится через AirPlay?

    Каков наилучший способ программно добавлять и удалять представления и их контроллеры?

    iOS GCM – GGLInstanceID | Недопустимая последняя временная отметка для проверки в будущем

    Каков наилучший способ предоставления видео в Интернете, который также работает на iPhone / iPad?

    Контроллер панели не отображается правильно

    Трудности с запуском приложения iOS 5 на iOS 4

    Некоторые видеоролики YouTube не воспроизводятся в UIWebView. Отображение – (Произошла ошибка, повторите попытку позже)

    Как нарисовать прозрачный UIToolbar или UINavigationBar в iOS7

    iOS Преобразование значения Hex

    Симулятор iOS не может подключаться к IP-адресу локальной сети

    Как получить объекты из одного массива с одинаковыми свойствами других?

    Как проверить и обновить состояние токена Facebook в iOS SDK 3.0?

    Пейджинг UICollectionView с помощью ячеек, а не экрана

    Копирование NSDictionary в NSArray

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.