web-dev-qa-db-ja.com

UICollectionView willDisplayCellデリゲートメソッド?

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

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

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

18
Devfly

参考までに、これはiOS8のAPIに追加されました。

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

遅延読み込みにはSDWebImagehttps://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];
  }];
 }
}
0
Ajith Tom

表示されるセルのインデックスパスを知る必要がある場合にも、同様の状況が発生します。 - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPathで終了します。おそらく、1つは「didEndDisplaying」であり、もう1つは「willDisplayed」です。

0
BabyPanda

cellForItemAtIndexPath:で次のようなことをしています(画像の遅延読み込み用):

  • モデルに画像がある場合は、セルの画像をそれに設定するだけです
  • モデルに画像がない場合は、非同期ロードを開始します
  • ロードが完了したら、元のindexPathがまだ表示されているかどうかを確認します
  • その場合は、元の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;
}
0