2013-04-01 10 views
8

मुझे लगातार UICollectionView में कक्षों को प्रदर्शित करने में समस्या हो रही है। कोशिकाओं का प्रारंभिक प्रदर्शन सही है, हालांकि हर बार जब उपयोगकर्ता अतीत को स्क्रॉल करता है और फिर कोशिकाओं के समूह में वापस प्रदर्शित होता है तो प्रदर्शन गलत होता है। पंक्तियों में केवल 2 या 1 सेल होना चाहिए। 2 कोशिकाएं प्रत्येक आधा प्रदर्शन चौड़ाई लेती हैं, 1 सेल पूर्ण चौड़ाई लेती है।UICollectionView लगातार लेआउट नहीं है, 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; 

} 

नीचे संग्रह डेटा का नमूना है।

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

सभी चित्र नीचे संग्रह दृश्य के समान अनुभाग को प्रदर्शित करते हैं।

Initial Display First scroll past Second scroll past

उत्तर

1

समस्या जनक इन्स्टेन्शियशन पर सौंपा एक निश्चित फ्रेम आकार होने के एक subview के कारण था। ओवरराइड सेटफ्रेम: यूआईसीओलेक्शन व्यू सबक्लास के लिए सबव्यू फ्रेम के मान असाइन करने के लिए और हर बार एक सेल को हटा दिया जाता है और कॉल सेट की आवश्यकता होती है फ्रेम: तदनुसार समायोजित करने के लिए।

0

आप गतिशील रूप से आइटम चौड़ाई की गणना करने का प्रयास कर सकते हैं।

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); 
    } 
} 
संबंधित मुद्दे