UICollectionView 在帧更改后错误地显示单元格
Posted
技术标签:
【中文标题】UICollectionView 在帧更改后错误地显示单元格【英文标题】:UICollectionView displays cells incorrectly after frame change 【发布时间】:2013-04-17 23:58:59 【问题描述】:我注意到,如果我更改 UICollectionView 的框架(例如,当切换通话状态栏时),集合视图不会为新框架正确更新其单元格。在短视频中可能最容易看到:
http://cl.ly/2t2Y2A3A2w1D/CollectionViewTest.mov
这个简单测试的源文件在这里:
http://cl.ly/0S0A360B3I3Q/CollectionViewTest.zip
我使用 UICollectionViewController 还是 UIViewController 似乎并不重要。有人见过这个吗?我错过了什么吗?我发现的唯一解决方法是在视图控制器的 viewWillLayoutSubviews 或 viewDidLayoutSubviews 中的集合视图上调用 reloadData ,这可以工作,但当集合视图的框架受到用户拖动的影响时远非理想,因为 reloadData 被多次调用并导致用户拖动时 UI 更新非常缓慢。
【问题讨论】:
【参考方案1】:我遇到了类似的问题,我的UICollectionView
的frame
发生了变化,除非我打电话给reloadData
,否则它会卡在同一个位置而没有与CollectionView
一起移动。
我已经通过将它添加到我的 CollectionViewFlowLayout 来修复它:
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
return YES;
工作得很好。
【讨论】:
谢谢。我没听说过,它似乎确实可以解决问题。虽然有一些动画故障,但这太糟糕了。这是一个快速视频,可以了解我的意思:cl.ly/3F173f173B3Q/CollectionViewTest.mov 对于任何对此感兴趣的人来说,这里有源文件:cl.ly/1c252y1J182h/CollectionViewTest.zip 无论如何,我认为这可能是 Apple 打算采用的技术,因此我将其标记为答案。再次感谢!【参考方案2】:我遇到了类似的问题。我只需要调整集合视图框架的大小,以便菜单可以显示在其下方,并且用户仍然可以向上滚动足够远,以使菜单不会覆盖底部的单元格。
更改内容插图对我有用。
self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, rect.size.height+8, 0);
如果不重新加载数据,我无法更改集合视图的框架以使其工作,这会破坏用户已经选择的单元格。
【讨论】:
【参考方案3】:您可以让您的 UICollectionViewController 为 UIApplicationWillChangeStatusBarFrameNotification 注册,并在选择器中重新加载数据。这样,您只会在状态栏更改框架时重新加载数据。
- (void)viewDidLoad
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callCameIn:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
-(void)callCameIn:(NSNotification *) aNote
[self.collectionView reloadData];
【讨论】:
谢谢。但在我的情况下,问题是集合视图的框架也可以通过用户拖动来更改。因此,我可以通过 viewWillLayoutSubviews 或 viewDidLayoutSubviews 连续重新加载数据,但正如我所提到的,这会使 UI 在拖动过程中变得迟缓——这是可以理解的,所有这些重新加载都在进行。这就是为什么我希望我要么做错了什么(即这不是 UICollectionView 错误),要么有其他一些没有明显影响性能的解决方法。 谢谢 - 这解决了我的问题!以上是关于UICollectionView 在帧更改后错误地显示单元格的主要内容,如果未能解决你的问题,请参考以下文章
重新加载数据后根据要求更新后未显示 uicollectionview 单元格
滚动条错误地出现在 UICollectionView 部分标题下方
iOS UICollectionView reloadData 错误地将模型映射到 ViewCell
当 UICollectionView 更改布局时覆盖 UIAccessibilityLayoutChangedNotification