2012-12-06 7 views
17

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?

risposta

50

Nel frattempo, ho trovato la soluzione. In realtà è stato un errore molto sottile nell'implementazione della sottoclasse UICollectionViewCellAlbumCoverCell.

Il problema è che ho impostato la cornice dell'istanza di cellula come la cornice del UIImageView visualizzazione secondaria invece di passare la proprietà bounds dell'Enciclopedia di contentView cellulare!

Ecco la correzione:

@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 
+4

ho fatto un errore simile - Grazie per aver postato la soluzione avete trovato! – krider2010

+2

@Tafkadasoh Grazie! Ha risolto il mio problema all'istante, stavo iniziando a colpire la mia testa contro il muro .. –

+2

@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

Problemi correlati