证明我的问题的最佳方式是使用以下视频:
http://foffer.dk/collectionview.mp4
正如您所看到的,我的collectionView不会更新它的布局以正确显示项目,直到我开始滚动。我正在使用单独的collectionViewFlowLayout模型。这是我的代码:
CollectionViewFlowLayout.m:
@implementation CollectionViewFlowLayout
- (void)prepareLayout {
CGFloat halfWidth = self.collectionView.bounds.size.width / 2;
CGFloat halfHeight = self.collectionView.bounds.size.height / 2;
self.itemSize = CGSizeMake(halfWidth, halfHeight);
self.minimumInteritemSpacing = 0;
self.minimumLineSpacing = 0;
}
// indicate that we want to redraw as we scroll
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
return YES;
}
@end
我的PhotosCollectionViewController(我遗漏了标准的collectionView内容,因为我认为这个问题不重要,请告诉我,如果是,我会发布它):
-(instancetype)init {
UICollectionViewFlowLayout *layout = [[CollectionViewFlowLayout alloc] init];
return (self = [super initWithCollectionViewLayout:layout]);
}
-(void) viewDidLoad{
[super viewDidLoad];
[self.collectionView registerClass:[FOFPhotoCell class] forCellWithReuseIdentifier:@"photo"];
self.collectionView.backgroundColor = [UIColor whiteColor];
CGFloat bottomLayoutGuide = self.tabBarController.tabBar.frame.size.height;
self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, bottomLayoutGuide, 0);
}
-(BOOL)shouldAutorotate{
return YES;
}
我需要在某处调用invalidateLayout吗?我似乎无法弄清楚在哪里实现该方法。 [self.collectionView invalidateLayout]
不起作用。
有人能让我走上正轨吗?
提前致谢 克里斯
答案 0 :(得分:1)
所以,事实证明我把它设置错了。来自苹果的this article说:
在开始构建自定义布局之前,请考虑是否这样做 真的很有必要。
UICollectionViewFlowLayout类提供了一个 已经优化的大量行为 效率和可以通过多种方式进行调整以实现许多目标 不同类型的标准布局。唯一需要考虑的时间 在以下情况下实现自定义布局:
您想要的布局看起来不像网格或基于行的中断 布局(将项目放入一行直到它已满的布局, 然后继续到下一行,直到所有项目都被放置)或 需要在多个方向上滚动。
您希望频繁更改所有单元格位置以使其更有效 修改现有的流程布局,而不是创建自定义布局。
我的布局配置非常简单。所以我过度复杂了。