帧更改后,UICollectionView会错误地显示单元格

时间:2013-04-17 23:59:00

标签: ios uicollectionview

我注意到如果我更改了UICollectionView的帧(例如,当切换调用状态栏时),集合视图不会为其新帧正确更新其单元格。在短片中可能最容易看到:

http://cl.ly/2t2Y2A3A2w1D/CollectionViewTest.mov

该简单测试的源文件位于:

http://cl.ly/0S0A360B3I3Q/CollectionViewTest.zip

我是否使用UICollectionViewController或UIViewController似乎并不重要。有没有人见过这个?我错过了什么吗?我发现的唯一解决方法是在视图控制器的viewWillLayoutSubviews或viewDidLayoutSubviews中的集合视图上调用reloadData,但是当集合视图的框架受到用户拖动的影响时,它远非理想,因为reloadData被多次调用并导致用户拖动时非常缓慢的UI更新。

3 个答案:

答案 0 :(得分:9)

我遇到了类似的问题,UICollectionView的{​​{1}}发生了变化,除非我致电frame,否则它会卡在同一地点而不会移动reloadData

我通过将它添加到我的CollectionViewFlowLayout:

来修复它
CollectionView

工作得很好。

答案 1 :(得分:2)

我有类似的问题。我只需要调整集合视图框架的大小,以便菜单可以显示在它下面,用户仍然可以向上滚动得足够远,菜单不会覆盖底部的单元格。

更改内容插件对我有用。

self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, rect.size.height+8, 0);

我无法在不重新加载数据的情况下更改集合视图的框架,这会搞砸用户已选择的单元格。

答案 2 :(得分:0)

您可以在UIApplicationWillChangeStatusBarFrameNotification中使用UICollectionViewController注册表,并在选择器中使用reloadData。这样,只有在状态栏更改帧时才会重新加载数据。

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callCameIn:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
}

-(void)callCameIn:(NSNotification *) aNote {
    [self.collectionView reloadData];
}