2012-11-19 11 views
14

Ho definito nella mia Storyboard (iPad) una vista che contiene uno UICollectionView, nella parte inferiore della vista c'è anche uno UIToolbar. Nel UICollectionView ho aggiunto un UICollectionViewCell (implementato da una classe iPadCellCollectionViewCell) che contiene un'altra vista che è un grafico di core-plot (una classe CPTGraphHostingView).Cella di UICollectionView non sempre aggiornata dopo una scroll

Ho una classe chiamata X che implementa lo UICollectionViewDelegate e UICollectionViewDataSource.

Nella classe X, ho costruire per ogni cella del mio punto di vista (in ViewDidLoad) Core-Plot Grafico e ho il seguente codice per linkare il grafico alla cella del UICollectionViewCell

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
static NSString* cellId = @"ChartCollectionId"; 

iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; 

MyChart* chart = [_charts objectAtIndex:indexPath.row]; 

cell.hostingView.hostedGraph = chart.barChart; 

return cell; 

}

Sta funzionando bene, tutti i miei grafici sono visualizzati correttamente sullo schermo. Il problema si verifica quando l'utente scorre la vista, quindi una o più celle diventano "vuote". Io davvero non capisco perché.

ho trovato una soluzione, invece di aggiungere il CPTGraphHostingView nel UICollectionViewCell in Interface Builder, costruisco io stesso e il codice precedente diventa:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
static NSString* cellId = @"ChartCollectionId"; 

iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; 


[cell.contentView addSubview:[_hostingViews objectAtIndex:indexPath.row]]; 

return cell; 

}

Con questo codice è tutto funziona bene. C'è qualche spiegazione sul perché non funziona quando sto aggiungendo il CPTGraphHostingView nel UICollectionViewCell con l'IB?

È un problema chiamare "addSubview" ogni volta che viene chiamato il metodo? Nessuna perdita di memoria?

risposta

3

Questo sembra essere un bug in UICollectionView quando si utilizza sectionInsets. Le celle non diventano invisibili, sono fuori luogo fuori dai limiti a volte sullo scorrimento veloce.

Quindi, se normalmente avresti 3 articoli per riga, otterrai un quarto elemento in una riga, ma nessun articolo nel primo punto della riga successiva.

Se si imposta UICollectionView in modo che non si agganci ai limiti e lo si sposta sopra l'interfaccia utente, si potrebbe vedere questa cella disallineata.

La mia soluzione era così lontana da non usare sectionInsets e la circonda usando contentInset e un po 'di spazio vuoto nelle intestazioni di sezione.

Ho trovato anche altri ragazzi su Twitter con lo stesso problema. C'è anche una segnalazione di bug: 12353513

+0

Dove posso vedere quel bug report? – bandejapaisa

9

Ho avuto un problema simile. L'ho risolto forzando un repaint quando viene chiamato il setFrame: sul mio contenuto personalizzato. Nel tuo caso, sottoclasse CPTGraphHostingView e sovrascrivere questo metodo:

-(void)setFrame:(CGRect)frame { 
    [super setFrame:frame]; 
    [self setNeedsDisplay]; // force drawRect: 
} 

Edit: Un modo più semplice per aggiornare vista cellulari quando vengono riutilizzati è quello di ignorare applyLayoutAttributes: in iPadCellCollectionViewCell come segue:

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { 
    // apply custom attributes... 
    [self.hostingView setNeedsDisplay]; // force drawRect: 
} 

Per quanto riguarda la tua soluzione: ci saranno sempre più sottoview nella visualizzazione del contenuto, che probabilmente non è una buona cosa. Tuttavia, se dovessi rimuovere qualsiasi subview precedente prima di aggiungerne uno nuovo, anche questo dovrebbe essere OK.

+2

Ho lo stesso problema con il rendering delle celle nella posizione sbagliata quando si scorre orizzontalmente, ma sfortunatamente nessuna di queste due correzioni ha funzionato per me. –

+0

Ottimo, ho provato entrambi gli approcci ed entrambi hanno funzionato. – anka

+0

grazie seconda opzione ha funzionato per me – slik

Problemi correlati