我无法以一致的方式在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:进行相应调整.