¿Las imágenes en UICollectionView se voltean automáticamente cuando se desplaza hacia abajo?

Estoy trabajando con UICollectionView donde estoy mostrando todas las imágenes de la biblioteca de fotos del teléfono.

Cuando hago clic en cualquiera de las imágenes, la image se voltea y aparece cierta información sobre la image.

Cuando el usuario vuelve a hacer clic en la misma image, la image vuelve a volcar y se muestra la image original.

El problema es que cada vez que me desploop hacia abajo a través de UICollectionView, la última image seleccionada se activa automáticamente y se muestra la información sobre la image.

Cómo detener este problema.

Aquí hay un código:

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell1 = [collectionView cellForItemAtIndexPath:indexPath]; if(old_path!=NULL){ UICollectionViewCell *cell2 = [collectionView cellForItemAtIndexPath:old_path]; [UIView transitionFromView:cell2.selectedBackgroundView toView:cell2.contentView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; } if(old_path==indexPath&&flag) { [cell1 setSelected:NO]; [UIView transitionFromView:cell1.selectedBackgroundView toView:cell1.contentView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; flag=FALSE; } else{ [UIView transitionFromView:cell1.contentView toView:cell1.selectedBackgroundView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; flag=TRUE; } old_path=indexPath; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath]; ALAsset *asset = assets[indexPath.row]; NSLog(@"Description : %@",[asset description]); UIImage *img=[self imageWithImage:[UIImage imageWithCGImage:[asset thumbnail]] convertToSize:CGSizeMake(150, 150)]; UIView *contents = [[UIView alloc]initWithFrame:cell.bounds]; contents.backgroundColor = [UIColor colorWithPatternImage:img]; [cell.contentView addSubview:contents]; UIView *backgroundView = [[UIView alloc]initWithFrame:cell.bounds]; backgroundView.backgroundColor = [UIColor yellowColor]; UIButton *del=[UIButton buttonWithType:UIButtonTypeRoundedRect]; del.frame= CGRectMake(backgroundView.frame.origin.x+20, backgroundView.frame.origin.y+20, 100, 40); [del setTitle:@"Delete" forState:UIControlStateNormal]; [del addTarget:self action:@selector(delete) forControlEvents:UIControlEventTouchUpInside]; [backgroundView addSubview:del]; UIButton *cancel=[UIButton buttonWithType:UIButtonTypeRoundedRect]; cancel.frame= CGRectMake(backgroundView.frame.origin.x+20, backgroundView.frame.origin.y+80, 100, 45); [cancel setTitle:@"Cancel" forState:UIControlStateNormal]; [cancel addTarget:self action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside]; [backgroundView addSubview:cancel]; cell.selectedBackgroundView = backgroundView; [cell bringSubviewToFront:cell.selectedBackgroundView]; return cell; } 

Aquí, old_path contiene el índice de la última image seleccionada.

El problema principal es probablemente con los methods de transición de UIView:

 [UIView transitionFromView:cell1.selectedBackgroundView toView:cell1.contentView duration:0.5 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

UICollectionViewCell 's contentView y selectedBackgroundView no deberían verse contentView esta forma, ya que la célula gestiona su layout. Este código eliminará la vista de contenido por completo y la replaceá por la vista de background, que se espera esté detrás de la vista de contenido cuando se select, y se eliminará de la jerarquía de vista cuando no esté seleccionada.

La forma correcta de realizar lo que está haciendo (mostrar / ocultar la image en respuesta a un toque) sería realizar la transición entre la vista de la image en sí misma y otra subvista en la vista de contenido.


También podría haber algo en el código de cambio de tamaño que está cambiando la image, pero es difícil decirlo sin el código de imageWithImage:convertToSize: Probablemente sería más eficiente deshacerse de ese método y hacer algo como esto:

 UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.bounds]; imageView.contentsMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; imageView.image = [UIImage imageWithCGImage:[asset thumbnail]]; [cell.contentsView addSubview:imageView]; 

Un par de otras observaciones:

Las celdas de vista de colección se reutilizan , lo que significa que su collectionView:cellForItemAtIndexPath: implementaciónView collectionView:cellForItemAtIndexPath: podría terminar agregando una stack completa de vistas de imágenes a una celda que se ha eliminado varias veces. Una solución mejor sería subclass UICollectionViewCell y agregar las vistas personalizadas en su método init .

El código old_path==indexPath realidad no testing la igualdad entre las dos routes de índice, solo si las dos variables tienen la misma dirección en la memory. Use [oldPath isEqual:indexPath] lugar.

No puede hacer animaciones personalizadas en vistas de background sin subclasss y manejo explícito. Porque la vista de colección trae automáticamente el selectedBackgroundView a la parte superior si selectedBackgroundView no es lo mismo que backgroundView . Agregando documentation de Apple para reference.

 // The background view is a subview behind all other views. // If selectedBackgroundView is different than backgroundView, it will be placed above the background view and animated in on selection. 

https://developer.apple.com/library/iOs/documentation/UIKit/Reference/UICollectionViewCell_class/Reference/Reference.html