Подтвердить что ты не робот

UICollectionView будет использовать метод делегатаDisplayCell?

В любом случае, чтобы взломать UICollectionView для вызова метода делегирования делегата willDisplayCell при отображении ячейки?

Мне нужно это для ленивой загрузки, и я делаю это хорошо с UITableView, но официально UICollectionView не имеет такого метода делегата.

Итак, какие-то идеи? Спасибо!

4b9b3361

Ответ 1

FYI, это было добавлено в API для iOS 8:

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0);

Ответ 2

Я делаю что-то вроде этого в cellForItemAtIndexPath: (для ленивых загружаемых изображений):

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

Похож:

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

    PhotoCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCell" forIndexPath:indexPath];
id imageItem = [self.photoSet objectAtIndex:indexPath.row];
        ImageManager * listingImage = (ImageManager *)imageItem;
        if(listingImage.image){
            cell.image = listingImage.image;
        } else {
            [listingImage loadImage:^(UIImage *image) {
                [collectionView reloadItemsAtIndexPaths:@[indexPath]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    if ([[collectionView indexPathsForVisibleItems] containsObject:indexPath]) {
                        [(PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath] setImage:image];
                    }
                });
            }];
        }
    }

    return cell;
}

Ответ 3

Вы можете использовать SDWebImage https://github.com/rs/SDWebImage для ленивой загрузки. Вы можете эффективно использовать это с помощью UICollectionView.


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

/*---------
----Other CollectiveView stuffs------
-----------------*/
if([[NSFileManager defaultManager] fileExistsAtPath:YOUR_FILE_PATH  isDirectory:NO])
{
      imagView.image=[UIImage imageWithContentsOfFile:YOUR_FILE_PATH];
}
else
{
     UIActivityIndicatorView *act=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
     [imagView addSubview:act];
     act.center=CGPointMake(imagView.frame.size.width/2, imagView.frame.size.height/2);
     [act startAnimating];

     __weak typeof(UIImageView) *weakImgView = imagView; 
     [imagView setImageWithURL:[NSURL URLWithString:REMOTE_FILE_PATH] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType){
    for(UIView *dd in weakImgView.subviews)
    {
        if([dd isKindOfClass:[UIActivityIndicatorView class]])
        {
            UIActivityIndicatorView *act=(UIActivityIndicatorView *)dd;
            [act stopAnimating];
            [act removeFromSuperview];
        }
    }
    NSString *extension=[YOUR_FILE_PATH pathExtension];

    [self saveImage:image withFileName:YOUR_FILE_PATH ofType:extension];
  }];
 }
}

Ответ 4

У меня есть аналогичная ситуация, когда мне нужно знать индексный путь ячейки, который будет отображаться. Заканчивается - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath. Предположительно, один из них "didEndDisplaying", другой - "willDisplayed".