我有UICollectionViewController
在肖像中显示 2列,在横向中显示 3列,如此:
我正在使用此代码触发旋转时的布局刷新:
- (void)updateViewConstraints
{
[super updateViewConstraints];
[[self.collectionView collectionViewLayout] invalidateLayout];
}
一切都很好,但是......
1。我正在查看Portrait中的collectionView:
一切都很好。
2。我点击其中一个单元格转到详细视图,该视图也支持两种方向。然后在详细视图中,我将方向切换为横向。还是不错的。
3。仍然在风景中,我现在点按< back
返回到collectionView,然后这就是我看到的内容:
我完全不知道这是什么原因。搜索SO和谷歌没有发现任何事情。
我尝试在collectionVC.m文件中实现此方法:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super blahblah];
[[self.collectionView collectionViewLayout] invalidateLayout];
}
虽然即使我在detailView上也会调用它,但它并没有解决问题。
那么对于出了什么问题的任何想法?
更新:我抓了一个screenshot of the UI hierarchy,可能有帮助。
答案 0 :(得分:3)
您遇到的问题是当集合viewController不可见时,旋转确实发生了。因此updateViewConstraints
和viewWillTransitionToSize:withTransitionCoordinator:
都不会被调用。
这个问题有两种可能的解决方法。
您可以观察方向的变化
// in viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
- (void)orientationDidChange:(NSNotification *)notification
{
//TODO: resetup the layout itemSize, etc if your it depend on the collection bounds.
// and make sure to do that after the rotation did happend(i.e in viewWillAppear or orientationDidChange:)
[[self.collectionView collectionViewLayout] invalidateLayout];
}
你可以使viewWillAppear
中的布局无效
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//TODO: resetup the layout itemSize, etc if your it depend on the collection bounds.
// and make sure to do that after the rotation did happend(i.e in viewWillAppear or orientationDidChange:)
[[self.collectionView collectionViewLayout] invalidateLayout];
}
答案 1 :(得分:0)
感谢Ismail的Answer,这让我走上了正确的道路,终于弄明白了:
仔细观察代码后,我做了一些观察:
首先,UICollectionViewController
正在适应旋转,viewWillTransitionToSize:
和updateViewConstraints
在提示上被调用。 3列/ 2列切换也正常进行,所有必需的数据源方法都被调用。
所以它不是CollectionViewController
然后我仔细研究了视图层次结构(问题末尾的图像链接)。
有趣的是,tabBar控制器仍然认为它是纵向的,而它上面和下面的所有东西都已切换到横向。标签栏和所有仍然是纵向宽度。
所以我刚刚在 CollectionViewController
的{{1}}方法中添加了这个:
viewDidAppear
击> <击> 撞击>
甚至更好,我将TabBar控制器子类化并添加了这个:
-(void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.tabBarController.view setNeedsDisplay];
}
这就是诀窍!
我仍然不知道为什么会这样。所以我会投资,并在我发现更多时更新我的答案。