Voglio mostrare le immagini in una griglia su iPhone utilizzando un UICollectionView, mostrando 3 immagini una riga. Per un "dead simple test" (come pensavo), ho aggiunto 15 immagini JPG al mio progetto, in modo che siano nel mio bundle e posso caricarle semplicemente tramite [UIImage imageNamed: ...].UICollectionView semplice per mostrare le immagini si comporta dispari: Alcune immagini vengono visualizzate corrette, alcune nella posizione errata, alcune mancanti a tutti
Penso di aver fatto tutto quello corretto (impostazione & registrazione sottoclasse UICollectionViewCell, uso di metodi UICollectionViewDataSource Protocol), tuttavia, l'UICollectionView si comporta molto strano:
Essa mostra solo alcune delle immagini di seguito modello: prima riga mostra immagine 1 & 3, seconda riga è vuota, riga successiva come la prima volta (immagine 1 & 3 mostra correttamente), quarta riga vuota, e così via ...
Se spingere un pulsante nel mio NavBar che attiva [self.collectionView reloadData], appaiono celle casuali o di sappear. Quello che mi fa impazzire è che non è solo un problema di immagini che appaiono o meno. A volte, le immagini si scambiano anche tra le celle, cioè appaiono per un indicePath che non sono sicuramente cablate!
Ecco il mio codice per la cella:
@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 codice per il mio sottoclasse UICollectionViewController, dove 'imageNames' è un NSArray lo svolgimento di tutti i nomi di file 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);
}
Dal NSLog istruzione in cellForItemAtIndexPath: posso vedere che il metodo è chiamato per tutte le celle (non solo quelle visualizzate) e che il mapping tra indexPath.row e filename è corretto.
Qualcuno ha idea di cosa potrebbe causare questo comportamento strano?
ho fatto un errore simile - Grazie per aver postato la soluzione avete trovato! – krider2010
@Tafkadasoh Grazie! Ha risolto il mio problema all'istante, stavo iniziando a colpire la mia testa contro il muro .. –
@Tafkadasoh OMG! Grazie così tanto! Risolto anche il mio problema. È la cosa più piccola, ma è stato un bug fastidioso. Grazie ancora per aver postato questo. Lo apprezzo davvero davvero. – GangstaGraham