iOS 8中嵌套的UICollectionViews,AutoLayout和旋转

The*_*Eye 3 rotation ios autolayout uicollectionview viewwilltransitiontosize

我开始使用AutoLayout进行大型项目,并对此感到非常惊讶.但是,现在我必须调整项目以适应旋转和大小类,并且我很难让视图正常运行.

该基地的问题是,我有UICollectionViews一遍包含UICollectionViews细胞.旋转设备时,基本集合视图会正确调整其单元格,但嵌套集合视图的所有单元格都不会自动调整为新大小.

调查后归结为:

  • viewWillTransitionToSize被调用时,基集合视图尚未旋转(如预期)
  • 在调用viewDidLayoutSubviews之后的某个时候,基本集合视图现在具有旋转的大小 - 但不幸的是它的单元格还没有 - 它们的宽度仍然是旋转前的大小
  • 即使在细胞coordinator animateAlongsideTransition ... completion:{}块中viewWillTransitionToSize也没有新的宽度.

上面的意思是没有地方我可以告诉嵌套集合视图的单元格改变它们的大小,因为我还不知道新的宽度; 并且自动布局系统不会自动调整它们.

有没有其他人有同样的问题或知道解决方案?

The*_*Eye 8

在这里回答我自己的问题 - 我终于找到了解决方案.对于其他遇到麻烦的人来说,这就是我所做的:

主要部分在于放置invalidateLayoutreloadData拨打正确的地方:

  • invalidateLayoutwillTransitionToSize函数中放置基本collectionView的布局.
  • 在函数的调用reloadData完成块中放置一个基本collectionView .coordinator animateAlongsideTransition:willTransitionToSize
  • 确保单元格中任何视图的自动布局约束设置正确 - 我将单元格视图与自动布局约束连接到代码中单元格的内容视图.
  • 如果您覆盖了prepareLayout集合视图布局的功能,请确保预先计算的单元格大小使用正确的宽度,我在这里使用了错误的宽度,这会导致一些其他问题.


小智 5

感谢眼睛。我想将此添加为对他们的回复的评论,但显然我还没有足够的业力,所以请将此视为附录。

我遇到了同样的问题,但是我的 uicollectionview 中的单元格在选择时具有“展开状态”。如果用户旋转设备并且我们调用[self.collectionview reloadData],则任何展开的单元格都将丢失其状态。您可以选择调用performBatchUpdates并强制集合视图进行布局,而不会丢失任何单元格的状态

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
[self.collectionView.collectionViewLayout invalidateLayout];

[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {

} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
    //[self.collectionView reloadData];//this works but reloading the view collapses any expanded cells.       
    [self.collectionView performBatchUpdates:nil completion:nil];       
}];  
}
Run Code Online (Sandbox Code Playgroud)