2012-11-19 11 views
14

Mam zdefiniowany w moim Storyboard (iPad) widoku, który zawiera UICollectionView, w dolnej części widoku jest również UIToolbar. W wersji UICollectionView dodano UICollectionViewCell (zaimplementowany przez klasę iPadCellCollectionViewCell), która zawiera inny widok, którym jest wykres Core-Plot (klasa CPTGraphHostingView).Komórka UICollectionView nie zawsze odświeżana po przewinięciu

Mam klasę o nazwie X, która implementuje UICollectionViewDelegate i UICollectionViewDataSource.

w klasie X, I zbudować dla każdej komórce moim zdaniem (w ViewDidLoad) Core-Plot Graph i mam następujący kod do połączenia wykres w komórce 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; 

}

Działa poprawnie, wszystkie moje wykresy są poprawnie wyświetlane na ekranie. Problem występuje, gdy użytkownik przewinie widok, a następnie jedna lub kilka komórek stanie się pusta. Naprawdę nie rozumiem, dlaczego.

Znalazłem obejście, zamiast dodawania CPTGraphHostingView w UICollectionViewCell w konstruktorze interfejsu, mam zbudować sobie i poprzedni kod staje:

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

}

z tego kodu wszystko jest Dobrze pracować. Czy są jakieś wyjaśnienia, dlaczego nie działa, gdy dodam CPTGraphHostingView z UICollectionViewCell do IB?

Czy wywołanie metody "addSubview" jest wywoływane przy każdym wywołaniu metody? Brak wycieków pamięci?

Odpowiedz

3

To wydaje się być błędem w UICollectionView przy użyciu sectionInsets. Komórki nie stają się niewidoczne, są niewłaściwie umieszczone poza granicami, czasami przy szybkim przewijaniu.

Więc jeśli normalnie będziesz mieć 3 przedmioty w rzędzie, otrzymasz czwartą pozycję w jednym rzędzie, ale bez pozycji na pierwszym miejscu następnego rzędu.

Jeśli ustawisz swój UICollectionView, aby nie był przycinany do granic i przesuwał go na wierzchu interfejsu użytkownika, możesz zobaczyć tę niewyrównaną komórkę.

Moje rozwiązanie polegało na tym, że nie używałem sectionInsets i otaczam go za pomocą contentInform i trochę pustego miejsca w nagłówkach sekcji.

Znalazłem też kilku innych gości na Twitterze z tym samym problemem. Istnieje również raport o błędzie: 12353513

+0

Gdzie mogę wyświetlić ten raport o błędzie? – bandejapaisa

9

Mam podobny problem. Naprawiłem to, zmuszając do odświeżenia, gdy setFrame: jest wywoływane w mojej niestandardowej treści. W twoim przypadku, podklasa CPTGraphHostingView i zastąpić ten sposób:

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

Edit: Łatwiejszy sposób, aby odświeżyć widok na komórki, gdy są one ponownie wykorzystywane jest do zastąpienia applyLayoutAttributes: w iPadCellCollectionViewCell następująco:

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

chodzi Twoje obejście: w widoku treści będzie coraz więcej subskrybentów, co prawdopodobnie nie jest dobrą rzeczą. Jeśli jednak usuniesz stare wyliczenie przed dodaniem nowego, powinno to być również OK.

+2

Mam taki sam problem z komórkami renderującymi w złym miejscu podczas przewijania w poziomie, ale niestety żadna z tych dwóch poprawek nie zadziałała. –

+0

Wspaniale, wypróbowałem oba podejścia i oba działały. – anka

+0

dzięki drugiej opcji pracował dla mnie – slik

Powiązane problemy