iphone UICollectionView будет метод делегата willDisplayCell?




ios xcode (4)

К вашему сведению, это было добавлено в API для iOS 8:

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

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

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

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


Вы можете использовать SDWebImage https://github.com/rs/SDWebImage для 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];
  }];
 }
}

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

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

Выглядит так:

- (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;
}

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







uicollectionview