19

とにかくUICollectionViewをハックして、セルを表示するときにwillDisplayCellデリゲートメソッドを呼び出すには?

遅延読み込みにはこれが必要で、UITableView でうまくやっていますが、正式には UICollectionView にはそのようなデリゲート メソッドはありません。

それで、何かアイデアはありますか?ありがとう!

4

4 に答える 4

0

遅延読み込みには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];
  }];
 }
}
于 2014-01-09T11:08:17.883 に答える
0

私は次のようなことをしています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;
}
于 2013-05-23T15:04:44.977 に答える