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
, Я бы увидел некоторые изображения, отображаемые как изображение, показанное выше, сначала, а затем изменить его правильное изображение после завершения загрузки, и я просто не знаю, что вызывает проблему.
пожалуйста, помогите мне разобраться эти две проблемы, я был бы очень признателен за любую помощь.
2 ответов
прежде всего, то, как вы добавляете изображения в свою ячейку, довольно опасно. Причина в том, что ваши ячейки используются повторно (например, при прокрутке или при перезагрузке), и эти изображения никогда не удаляются при повторном использовании. Таким образом, вы начнете видеть их повсюду, и вы даже можете добраться до точки, где ваша ячейка содержит несколько вхождений изображения. Вот два способа сделать это:--4-->
-
Первый способ (хороший способ): вы подкласс UICollectionViewCell, и дайте подклассу свойство "imageView". Затем вы делаете это в своем CustomCollectionViewCell.файл м :
// 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 вы должны объявить новый класс ваших collectionViewCells следующим образом:
[self.collectionView registerClass:[CustomCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
это гарантирует, что изображения будут правильно удалены при повторном использовании, а также проще настроить ячейку в делегате collectionView.
-
Второй способ (грязный способ), вы удаляете представления каждый раз при загрузке новая ячейка:
- (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
Теперь попробуйте это и дайте мне знать, как развивается ваша ошибка.
код для Swift 4
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) var imageview:UIImageView=UIImageView(frame: CGRect(x: 50, y: 50, width: 200, height: 200)); var img : UIImage = UIImage(named:"Your image name") imageview.image = img cell.contentView.addSubview(imageview) } return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSize(width: 50, height: 414) }