我无法以一致的方式在UICollectionView中显示单元格.单元的初始显示是正确的,但是每次用户滚动过去然后返回到一组单元格时,显示都是不正确的.行应该只包含2个或1个单元格. 2个单元格,每个显示宽度的一半,1个单元格占全宽.
- (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>" ); } )
下面的图片都展示了集合视图的相同部分.
解决方法
问题是由父实例的子视图引起的,该子视图具有在实例化时分配的固定帧大小. Overrode setFrame:用于UICollectionView子类以分配子视图帧的值,每次单元格出列并重新排队时调用setFrame:进行相应调整.