2012-11-19 18 views
14

Ich habe in meinem Storyboard (iPad) eine Ansicht definiert, die eine UICollectionView enthält, am unteren Rand der Ansicht gibt es auch eine UIToolbar. In der UICollectionView habe ich eine UICollectionViewCell (durch eine iPadCellCollectionViewCell Klasse implementiert) hinzugefügt, die eine andere Ansicht enthält, die ein Core-Plot Graph (eine CPTGraphHostingView Klasse) ist.Zelle von UICollectionView nicht immer nach einem Bildlauf aktualisiert

Ich habe eine Klasse namens X, die die UICollectionViewDelegate und UICollectionViewDataSource implementiert.

In der Klasse X, baue ich für jede Zelle meiner Ansicht (in ViewDidLoad) Core-Plot Graph und ich habe den folgenden Code, um das Diagramm, um die Zelle der 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; 

} verlinken

Es funktioniert gut, alle meine Diagramme werden korrekt auf dem Bildschirm angezeigt. Das Problem tritt auf, wenn der Benutzer die Ansicht scrollt, dann werden eine oder mehrere Zellen "leer". Ich verstehe wirklich nicht warum.

ich eine Abhilfe gefunden haben, statt die CPTGraphHostingView im UICollectionViewCell im Interface Builder hinzufügen, baue ich es selbst und der vorherige Code wird:

- (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; 

}

Mit diesem Code ist alles funktioniert gut. Gibt es irgendwelche Erklärungen, warum es nicht funktioniert, wenn ich die CPTGraphHostingView in der UICollectionViewCell mit dem IB hinzufüge?

Ist es ein Problem, bei jedem Aufruf der Methode "addSubview" aufzurufen? Keine Speicherlecks?

Antwort

3

Dies scheint ein Fehler in UICollectionView bei der Verwendung von sectionInsets. Die Zellen werden nicht unsichtbar, sie werden manchmal beim schnellen Scrollen außerhalb der Grenzen verschoben.

Wenn Sie also normalerweise 3 Elemente pro Zeile haben, erhalten Sie ein viertes Element in einer Zeile, aber kein Element an der ersten Stelle der nächsten Zeile.

Wenn Sie Ihre UICollectionView so einstellen, dass sie nicht an Begrenzungen klammert und sie über Ihre Benutzeroberfläche bewegt, sehen Sie möglicherweise die falsch ausgerichtete Zelle .

Meine Lösung war bisher, sectionInsets nicht zu verwenden und sie mit contentInset und etwas leerem Bereich in den Abschnittsheadern zu umgeben.

Ich habe auch einige andere Jungs bei Twitter mit dem gleichen Problem gefunden. Es gibt auch einen Fehlerbericht darüber: 12353513

+0

Wo sehe ich diesen Fehlerbericht? – bandejapaisa

9

Ich hatte ein ähnliches Problem. Ich reparierte es, indem ich ein Repaint erzwang, wenn setFrame: auf meinem kundenspezifischen Inhalt angerufen wird. In Ihrem Fall, Unterklasse CPTGraphHostingView und überschreibt diese Methode:

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

Edit: Eine einfachere Möglichkeit Zelle Ansichten zu aktualisieren, wenn sie wiederverwendet werden, ist applyLayoutAttributes: in iPadCellCollectionViewCell außer Kraft zu setzen, wie folgt:

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

Bezüglich Ihre Problemumgehung: In der Inhaltsansicht wird es mehr und mehr Subviews geben, was wahrscheinlich nicht gut ist. Wenn Sie jedoch eine alte Unteransicht entfernen, bevor Sie die neue hinzufügen, sollte das auch OK sein.

+2

Ich habe das gleiche Problem mit Zellen Rendern an der falschen Stelle beim horizontalen Scrollen, aber leider funktionierte keine dieser beiden Fixes für mich. –

+0

Großartig, versuchte beide Ansätze und beide funktionierten. – anka

+0

Danke zweite Option für mich funktioniert – slik

Verwandte Themen