cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发
Posted
技术标签:
【中文标题】cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发【英文标题】:cellForItemAtIndexPath: firing in iOS7 but not iOS6 【发布时间】:2014-01-15 18:18:11 【问题描述】:最近添加带有自定义UICollectionViewFlowLayout
子类的UICollectionView
时,collectionView:cellForItemAtIndexPath:
方法仅在 ios7 上被调用,而不是在 iOS6 上调用。换句话说,在 iOS7 中一切正常,但我的自定义 collectionView 项目在 iOS6 中没有显示。有趣的是,单元格似乎在那里(collectionView 滚动),但所有项目都是空的,背景为白色。
collectionView在.xib文件中设置,dataSource和delegate附加,UICollectionViewDataSource和UICollectionViewDelegateFlowLayout在视图控制器.h文件中@interface调用后添加。
collectionView item size、section inset、行间距、item间距都是在自定义流布局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;
编辑:问题已解决。我的自定义流布局包括一些使用新 UIDynamicAnimator
类的 iOS7 特定覆盖。这些不会导致崩溃,但会阻止在 iOS6 中绘制单元格。
【问题讨论】:
我猜你的布局有问题,所以看看TFSpringFlowLayout
的内容和任何相关的委托方法会很有帮助。
【参考方案1】:
这就是我的问题,以防其他人将来遇到这个问题。
我的自定义 UICollectionViewFlowLayout 包含几个方法覆盖来实现 iOS7 的新 UIKit 动态。这些不会导致应用程序崩溃,但会阻止在 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 并仅返回适当的响应为我解决了这个问题。希望这对其他人有帮助!
【讨论】:
你应该用修复更新这个答案,而不仅仅是问题。 仅供参考 - 这不是一个好的解决方案。检查类或方法的存在总是比检查操作系统版本更好。 @rmaddy 感谢提示,我已编辑答案以使用 [UIDynamicAnimator 类] 检查而不是操作系统以上是关于cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发的主要内容,如果未能解决你的问题,请参考以下文章
cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发
集合视图:可以手动触发 cellForItemAtIndexPath 吗?
collectionView:cellForItemAtIndexPath: 永远不会被调用
使用 UICollectionViewFlowLayout / UICollectionViewLayout 子类,不会在正确的时间调用 CellForItemAtIndexPath
在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架