tutorial example collection iphone ios xcode cocoa-touch uicollectionview

iphone - example - uicollectionview swift 4



¿UICollectionView va a mostrar el método de delegado de celda? (4)

Estoy haciendo algo como esto en cellForItemAtIndexPath: (para la carga perezosa de imágenes):

  • Si mi modelo tiene la imagen, solo configura la imagen de la celda
  • Si el modelo no tiene una imagen, patear una carga asíncrona.
  • Cuando se completa la carga, se comprueba si la indexPath original todavía está visible
  • Si es así, llame a cellForItemAtIndexPath para la indexPath original. Como la imagen ahora existe en el modelo, la imagen de la celda ahora estará configurada.

Se ve como esto:

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

¿De todos modos hackear UICollectionView para llamar al método delegado willDisplayCell, cuando se muestra el celular?

Necesito esto para la carga lenta, y lo estoy haciendo bien con UITableView, pero oficialmente UICollectionView no tiene ese tipo de método de delegado.

Entonces, ¿alguna idea? ¡Gracias!


Para su información, esto se ha agregado a la API para iOS 8:

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


Puede utilizar SDWebImage https://github.com/rs/SDWebImage para realizar una carga perezosa. Puedes usar esto efectivamente con 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]; }]; } }


Tengo una situación similar cuando necesito saber la ruta del índice de la celda que se va a mostrar. Terminó con - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath . Supongo que uno es "didEndDisplaying", otro es "willDisplayed".