CollectionView布局在滚动之前不会刷新

时间:2014-04-18 21:58:53

标签: ios uicollectionview uicollectionviewlayout

证明我的问题的最佳方式是使用以下视频:

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]不起作用。

有人能让我走上正轨吗?

提前致谢 克里斯

1 个答案:

答案 0 :(得分:1)

所以,事实证明我把它设置错了。来自苹果的this article说:

  

在开始构建自定义布局之前,请考虑是否这样做   真的很有必要。

     

UICollectionViewFlowLayout类提供了一个   已经优化的大量行为   效率和可以通过多种方式进行调整以实现许多目标   不同类型的标准布局。唯一需要考虑的时间   在以下情况下实现自定义布局:

     

您想要的布局看起来不像网格或基于行的中断   布局(将项目放入一行直到它已满的布局,   然后继续到下一行,直到所有项目都被放置)或   需要在多个方向上滚动。

     

您希望频繁更改所有单元格位置以使其更有效   修改现有的流程布局,而不是创建自定义布局。

我的布局配置非常简单。所以我过度复杂了。