8

Ho problemi a visualizzare le celle in un UICollectionView in modo coerente. La visualizzazione iniziale delle celle è corretta, tuttavia ogni volta che l'utente scorre e torna a un gruppo di celle, la visualizzazione non è corretta. Le righe dovrebbero contenere solo 2 o 1 cella (s). 2 celle ciascuna occupano metà della larghezza del display, 1 cella occupa tutta la larghezza.UICollectionView layout non coerente, 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; 

} 

Di seguito è riportato un esempio dei dati di raccolta.

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>" 
    ); 
} 
) 

Le foto seguenti mostrano tutte la stessa sezione della vista di raccolta.

Initial Display First scroll past Second scroll past

risposta

1

problema è stato causato da una visualizzazione secondaria del genitore avente una dimensione telaio fisso assegnato a istanziazione. Overrode setFrame: per la sottoclasse UICollectionView per assegnare i valori dei fotogrammi subview e ogni volta che una cella viene rimossa dalla coda e riaccesa chiama setFrame: per regolare di conseguenza.

0

È possibile provare a calcolare in modo dinamico la larghezza dell'elemento.

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); 
    } 
}