uiimageview ios6 uicollectionview uicollectionviewcell

uiimageview - UICollectionView simple para mostrar imágenes se comporta de forma extraña: algunas imágenes se muestran correctamente, algunas en la posición incorrecta, otras faltan en absoluto



ios6 uicollectionviewcell (1)

Mientras tanto, he encontrado la solución. En realidad, fue un error muy sutil en la implementación de mi subclase AlbumCoverCell .

El problema es que he establecido el marco de la instancia de celda como el marco de la subvista UIImageView lugar de pasar la propiedad de límites de contentView de la celda.

Aquí está la solución:

@implementation AlbumCoverCell @synthesize imageView = _imageView; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // WRONG: // _imageView = [[UIImageView alloc] initWithFrame:frame]; // RIGHT: _imageView = [[UIImageView alloc] initWithFrame:self.contentView.bounds]; [self.contentView addSubview:_imageView]; } return self; } - (void)prepareForReuse { [super prepareForReuse]; // reset image property of imageView for reuse self.imageView.image = nil; // update frame position of subviews self.imageView.frame = self.contentView.bounds; } ... @end

Quiero mostrar imágenes en una cuadrícula en iPhone usando una vista Uollollection, mostrando 3 imágenes por fila. Para una "prueba sencilla" (como pensé), he agregado 15 imágenes JPG a mi proyecto, para que estén en mi paquete y las pueda cargar simplemente a través de [UIImage imageNamed: ...].

Creo que he hecho todo correctamente (configurando y registrando la subclase UICollectionViewCell, utilizando los métodos del protocolo UICollectionViewDataSource), sin embargo, el UICollectionView se comporta de manera muy rara:

Muestra solo algunas de las imágenes en el siguiente patrón: la primera línea muestra la imagen 1 y 3, la segunda línea está en blanco, la siguiente línea como la primera nuevamente (la imagen 1 y 3 se muestra correctamente), la cuarta línea en blanco, etc. .

Si presiono un botón en mi barra de navegación que activa [self.collectionView reloadData], aparecen o desaparecen celdas aleatorias. Lo que me vuelve loco es que no es solo un problema de imágenes que aparecen o no. En algún momento, las imágenes también se intercambian entre las celdas, es decir, aparecen para una indexPath que definitivamente no están conectadas.

Aquí está mi código para el celular:

@interface AlbumCoverCell : UICollectionViewCell @property (nonatomic, retain) IBOutlet UIImageView *imageView; @end @implementation AlbumCoverCell @synthesize imageView = _imageView; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { _imageView = [[UIImageView alloc] initWithFrame:frame]; [self.contentView addSubview:_imageView]; } return self; } - (void)dealloc { [_imageView release]; [super dealloc]; } - (void)prepareForReuse { [super prepareForReuse]; self.imageView.image = nil; } @end

Parte del código de mi subclase UICollectionViewController, donde ''imageNames'' es una NSArray que contiene todos los nombres de archivos jpg:

- (void)viewDidLoad { [super viewDidLoad]; [self.collectionView registerClass:[AlbumCoverCell class] forCellWithReuseIdentifier:kAlbumCellID]; } #pragma mark - UICollectionViewDataSource Protocol methods - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return [self.imageNames count]; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { AlbumCoverCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kAlbumCellID forIndexPath:indexPath]; NSString *imageName = [self.imageNames objectAtIndex:indexPath.row]; NSLog(@"CV setting image for row %d from file in bundle with name ''%@''", indexPath.row, imageName); cell.imageView.image = [UIImage imageNamed:imageName]; return cell; } #pragma mark - UICollectionViewDelegateFlowLayout Protocol methods - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; { return CGSizeMake(100, 100); } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section; { return UIEdgeInsetsMake(0, 0, 0, 0); }

De la declaración NSLog en cellForItemAtIndexPath: Puedo ver que se llama al método para todas las celdas (no solo a las que se muestran) y que la asignación entre indexPath.row y el nombre de archivo es correcta.

¿Alguien tiene una idea de qué podría causar este extraño comportamiento?