cellForItemAtIndexPath:在iOS7中触发但不在iOS6中触发

时间:2014-01-15 18:18:11

标签: ios objective-c uicollectionview uicollectionviewlayout

最近添加UICollectionView个自定义UICollectionViewFlowLayout子类时,collectionView:cellForItemAtIndexPath:方法仅在 ,而不是在iOS6上调用。换句话说,一切都在iOS7中运行良好,但我的自定义collectionView项目没有在iOS6中显示。有趣的是,单元格似乎在那里(collectionView滚动),但所有项目都是空的,背景为白色。

在.xib文件中设置了collectionView,附加了dataSource和delegate,并在视图控制器.h文件中的@interface调用之后添加了UICollectionViewDataSource和UICollectionViewDelegateFlowLayout。

collectionView项目大小,部分插入,行间距和项目间距都在自定义流程布局init方法中设置。

一些代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.collectionView.collectionViewLayout = [[TFSpringFlowLayout alloc] init];
    [self.collectionView registerClass:[TFWorkoutCell class] forCellWithReuseIdentifier:CellIdentifier];
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    // This method is returning a value > 0
    return _workouts.count;
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
    // This is being called on iOS7, but is never being called on iOS6
    ...removed for clarity
    return cell;
}

编辑:问题已解决。我的自定义Flow Layout包含一些使用新UIDynamicAnimator类的iOS7特定覆盖。这些并没有导致崩溃,但是阻止了在iOS6中绘制单元格。

1 个答案:

答案 0 :(得分:1)

以下是我遇到的问题,以防其他人在将来遇到此问题。

我的自定义UICollectionViewFlowLayout包含几个方法覆盖来实现iOS7的新UIKit Dynamics。这些不会导致应用程序崩溃,但会阻止在iOS6中绘制单元格。

以下是有问题的代码:

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    return [self.dynamicAnimator itemsInRect:rect];
}

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
}

修复所需的简单更改:

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    if ([UIDynamicAnimator class])
        return [self.dynamicAnimator itemsInRect:rect];
    else
        return [super layoutAttributesForElementsInRect:rect];
}

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    if ([UIDynamicAnimator class])
        return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
    else
        return [super layoutAttributesForItemAtIndexPath:indexPath];
}

添加if / else语句来检查iOS6或iOS7,只返回相应的响应为我解决了问题。希望这有助于其他人!