UICollectionView布局不一致,UICollectionViewFlowLayout

8

我在UICollectionView中展示单元格时遇到了一些问题,无法保持一致的方式。初始单元格的展示是正确的,但用户每次滚动到一组单元格再回来时,展示会变得不正确。每一行应该只包含 1 个或 2 个单元格,其中 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>"
    );
}
)

以下图片均展示了集合视图的同一部分。 初始显示 首次滚动 第二次滚动
2个回答

1
问题是由于父视图的子视图在实例化时分配了固定的框架大小所致。 重写了UICollectionView子类的setFrame:以分配子视图框架的值,并且每次单元格被出列和重新排队时调用setFrame:以相应地进行调整。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接