7

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

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

该简单测试的源文件在这里:

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

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

4

3 回答 3

10

我遇到了类似的问题,我UICollectionView的.framereloadDataCollectionView

我已经通过将它添加到我的 CollectionViewFlowLayout 来修复它:

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
    return YES;
}

工作得很好。

于 2013-05-29T08:51:53.547 回答
2

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

更改内容插图对我有用。

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

如果不重新加载数据,我无法更改集合视图的框架以工作,这会搞砸用户已经选择的单元格。

于 2013-05-14T16:56:55.183 回答
0

您可以让 UICollectionViewController 为 UIApplicationWillChangeStatusBarFrameNotification 注册,并在选择器中重新加载数据。这样,您只会在状态栏更改框架时重新加载数据。

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

-(void)callCameIn:(NSNotification *) aNote {
    [self.collectionView reloadData];
}
于 2013-04-18T05:51:52.087 回答