8

Ich habe Probleme, die Zellen in einer UICollectionView in konsistenter Weise anzuzeigen. Die anfängliche Anzeige der Zellen ist korrekt, jedoch ist jedes Mal, wenn der Benutzer vorbei und dann zurück zu einer Gruppe von Zellen scrollt, die Anzeige falsch. Zeilen sollten immer nur 2 oder 1 Zelle (n) enthalten. 2 Zellen nehmen jeweils die halbe Bildschirmbreite ein, 1 Zelle nimmt die volle Breite ein.UICollectionView nicht konsistentes Layout, UICollectionViewFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self preferredSizeForIndexPath:indexPath]; 
} 

- (CGSize)preferredSizeForIndexPath:(NSIndexPath *)indexPath { 

    BOOL isLastObjectInSection = NO; 
    NSString *sectionKey = [[arrCollectionData[indexPath.section] allKeys] objectAtIndex:0]; 
    DLog(@"SectionKey: %@", sectionKey); 
    NSArray *arrSection = [arrCollectionData[indexPath.section] objectForKey:sectionKey]; 
    DLog(@"ArrSection: %@", arrSection); 

    if (arrSection[indexPath.row] == arrSection.lastObject) { 
     if(arrSection.count % 2 != 0) { 
      isLastObjectInSection = YES; 
     } 
    } 

    CGSize cellSize = CGSizeZero; 
    if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { 
     if (isLastObjectInSection == YES) { 
      cellSize = CGSizeMake(IPAD_BADGE_WIDTH_LANDSCAPE_WIDE, IPAD_BADGE_HEIGHT_LANDSCAPE_WIDE); 
     } else { 
      cellSize = CGSizeMake(IPAD_BADGE_WIDTH_LANDSCAPE, IPAD_BADGE_HEIGHT_LANDSCAPE); 
     } 
    } else { 
     if (isLastObjectInSection == YES) { 
      cellSize = CGSizeMake(IPAD_BADGE_WIDTH_WIDE, IPAD_BADGE_HEIGHT_WIDE); 
     } else { 
      cellSize = CGSizeMake(IPAD_BADGE_WIDTH, IPAD_BADGE_HEIGHT); 
     } 
    } 
    DLog(@"CellSize: %@", NSStringFromCGSize(cellSize)); 
    return cellSize; 

} 

Im Folgenden finden Sie ein Beispiel für die Sammlungsdaten.

Printing description of self->arrCollectionData: 
<__NSArrayI 0x94bbc40>(
{ 
    "March 12, 2013" =  (
     "<FMLeafTimelineContainer: 0x94b2430>", 
     "<FMLeafTimelineContainer: 0x94b3670>" 
    ); 
}, 
{ 
    "February 25, 2013" =  (
     "<FMLeafTimelineContainer: 0x94b4500>" 
    ); 
}, 
{ 
    "February 14, 2013" =  (
     "<FMLeafTimelineContainer: 0x94b48f0>", 
     "<FMLeafTimelineContainer: 0x94b3a60>" 
    ); 
}, 
{ 
    "February 12, 2013" =  (
     "<FMLeafTimelineContainer: 0x94b3ce0>", 
     "<FMLeafTimelineContainer: 0x94b2b00>" 
    ); 
}, 
{ 
    "February 4, 2013" =  (
     "<FMCommunityTimelineContainer: 0x94b4e90>", 
     "<FMCommunityTimelineContainer: 0x94b5050>", 
     "<FMCommunityTimelineContainer: 0x94b5f70>" 
    ); 
}, 
{ 
    "January 30, 2013" =  (
     "<FMCommunityTimelineContainer: 0x94b6ad0>", 
     "<FMCommunityTimelineContainer: 0x94b5a90>" 
    ); 
}, 
{ 
    "January 24, 2013" =  (
     "<FMCommunityTimelineContainer: 0x94b5d00>", 
     "<FMCommunityTimelineContainer: 0x94b6d90>" 
    ); 
}, 
{ 
    "January 22, 2013" =  (
     "<FMCommunityTimelineContainer: 0x94b6440>" 
    ); 
}, 
{ 
    "January 21, 2013" =  (
     "<FMCommunityTimelineContainer: 0x94b6260>", 
     "<FMCommunityTimelineContainer: 0x94b62e0>", 
     "<FMCommunityTimelineContainer: 0x94b70c0>", 
     "<FMCommunityTimelineContainer: 0x94b55a0>", 
     "<FMCommunityTimelineContainer: 0x94b82d0>", 
     "<FMCommunityTimelineContainer: 0x94b78b0>" 
    ); 
}, 
{ 
    "December 20, 2012" =  (
     "<FMCommunityTimelineContainer: 0x94b53f0>" 
    ); 
}, 
{ 
    "December 6, 2012" =  (
     "<FMCommunityTimelineContainer: 0x94b7200>" 
    ); 
}, 
{ 
    "December 4, 2012" =  (
     "<FMCommunityTimelineContainer: 0x94b72b0>" 
    ); 
}, 
{ 
    "November 19, 2012" =  (
     "<FMCommunityTimelineContainer: 0x94b7ae0>" 
    ); 
} 
) 

Die Bilder unten zeigen den gleichen Abschnitt der Sammlungsansicht.

Initial Display First scroll past Second scroll past

Antwort

1

Problem wurde durch eine Unteransicht der Mutter verursacht eine feste Rahmengröße bei der Instanziierung zugeordnet ist. Übersteuerte setFrame: für UICollectionView-Unterklasse, um Werte von Subview-Frames zuweisen und jedes Mal, wenn eine Zelle aus der Warteschlange und requeued wird CallFrame: um entsprechend anzupassen.

0

Sie können versuchen, die Artikelbreite dynamisch zu berechnen.

CGFloat fullItemWidth = self.collectionView.bounds.size.width; 
NSInteger itemsPerRow = 2; 
CGFloat itemWidth = (fullItemWidth - (itemsPerRow-1)*self.collectionView.collectionViewLayout.minimumInteritemSpacing)/itemsPerRow; 
if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { 
    if (isLastObjectInSection == YES) { 
     cellSize = CGSizeMake(fullItemWidth, IPAD_BADGE_HEIGHT_LANDSCAPE_WIDE); 
    } else { 
     cellSize = CGSizeMake(halfItemWidth, IPAD_BADGE_HEIGHT_LANDSCAPE); 
    } 
} else { 
    if (isLastObjectInSection == YES) { 
     cellSize = CGSizeMake(fullItemWidth, IPAD_BADGE_HEIGHT_WIDE); 
    } else { 
     cellSize = CGSizeMake(halfItemWidth, IPAD_BADGE_HEIGHT); 
    } 
}