UICollectionView数据源无法按预期工作

时间:2013-08-16 02:17:19

标签: iphone objective-c uicollectionview

所以我遇到了一个独特的问题。我有一个可以查找的UICollectionView,只要我从中拉出的数组中至少有2个对象。

- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    NSLog(@"Allocating space for %i photos in collectionView", [CCPhotos sharedPhotos].photos.count);
    return [CCPhotos sharedPhotos].photos.count;
}

// configure cells
- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier: @"PhotoCell" forIndexPath: indexPath];

    NSLog(@"Creating cell for row %i", indexPath.row);

    for (UIView* view in cell.contentView.subviews)
        [view removeFromSuperview];

    cell.layer.cornerRadius = 20.0f;
    cell.layer.masksToBounds = YES;

    // Add image to cell
    UIImageView* imageView = [[UIImageView alloc] initWithImage: [[CCPhotos sharedPhotos].photos objectAtIndex: indexPath.row]];

    // size imageView and set content mode
    imageView.frame = cell.contentView.frame;

    // add imageView to cell
    [cell.contentView addSubview: imageView];


    return cell;
}
始终会调用

numberOfItemsInSection并返回正确的值,但如果它小于2,则不会调用cellForItemAtIndexPath。有什么想法吗?

编辑: 我忘了提到我使用了我自己的流程布局来设置它:

 - (id) init
{
    if (self = [super init])
    {
        self.itemSize = CGSizeMake(ITEM_WIDTH, ITEM_HEIGHT);
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.sectionInset = UIEdgeInsetsMake(0, (320 - ITEM_WIDTH) / 2, 0, 0);
        self.minimumLineSpacing = 320 - ITEM_WIDTH;


    }

    return self;
}

3 个答案:

答案 0 :(得分:0)

听起来这个项目不在屏幕上,在这种情况下numberOfItemsInSection将返回1,但不会调用cellForItemAtIndexPath。检查你的布局。

您可以像这样覆盖layoutAttributesForElementsInRect以验证返回的属性(如果有)。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
    NSLog(@"%@", attributes);
    return attributes;
}

如果没有返回,那么这是关于布局细节(或流布局错误)的原因,导致项目出现在屏幕外。

答案 1 :(得分:0)

首先,对不起,我的英语很差!

您是否编写了集合的布局,dataSource和委托?

例如

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.itemSize = CGSizeMake(91.0f, (screenSize.height - TopNavigationBarHeight - 24.0f) / 3.0f);
flowLayout.sectionInset = UIEdgeInsetsMake(10.0f, 10.0f, 10.0f, 11.0f);
flowLayout.minimumInteritemSpacing = 10.0f;
flowLayout.minimumLineSpacing = 10.0f;
self.stepCollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, TopNavigationBarHeight, screenSize.width, screenSize.height - TopNavigationBarHeight) collectionViewLayout:flowLayout];
self.stepCollectionView.dataSource = self;
self.stepCollectionView.delegate = self;
[self.stepCollectionView registerClass:[StepThumbnailCollectionViewCell class]
            forCellWithReuseIdentifier:ItemIdentifier];
[self.view addSubview:self.stepCollectionView]; 

我希望它有所帮助。

答案 2 :(得分:0)

我弄明白了这个问题。我不确定是不是因为我在平移到照片时实现了缩放效果,但我的itemSize太大了。我将ITEM_WIDTH和ITEM_HEIGHT设置为较小的值并且有效