2013-04-01 16 views
8

UICollectionView'daki hücreleri tutarlı bir şekilde görüntülemede sorun yaşıyorum. Hücrelerin ilk ekranı doğrudur, ancak kullanıcı her geçtiğinde ve bir grup hücreye geri döndüğünde ekran yanlıştır. Satırlar yalnızca 2 veya 1 hücre içermelidir. Her biri, ekran genişliğinin yarısını alan 2 hücre, tam genişliğe sahip 1 hücre.UICollectionView tutarlı olmayan düzen, 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; 

} 

Toplama verilerinin bir örneği aşağıdadır.

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

Aşağıdaki resimlerin tümü, koleksiyon görünümünün aynı bölümünü gösterir.

Initial Display First scroll past Second scroll past

cevap

1

sorun örnekleme atanan bir sabit çerçeve boyutuna sahip olan ebeveynin bir subview neden oldu. SetFrame overrode: alt görünüm çerçevelerinin değerlerini atamak için UICollectionView alt sınıfı için ve bir hücre dequeued ve requeued çağrı setFrame her zaman: buna göre ayarlamak için.

0

Öğe genişliğini dinamik olarak hesaplamayı deneyebilirsiniz.

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); 
    } 
} 
İlgili konular