pop segue 后方向不更新
Orientation not updating after pop segue
我的设置
我有一个 UICollectionViewController
,它在纵向 中显示 2 列,在横向 中显示 3 列,就像这样:
. . . .
我正在使用此代码在旋转时触发布局刷新:
- (void)updateViewConstraints
{
[super updateViewConstraints];
[[self.collectionView collectionViewLayout] invalidateLayout];
}
一切正常,但是...
问题
1. 我正在纵向查看 collectionView :
一切都很好。
2. 我点击其中一个单元格进入详细视图,它也支持两个方向。然后在详细视图中,我 将方向切换为横向 。还是不错的。
3. 仍然在风景中,我现在点击 < back
返回到 collectionView,然后这就是我看到的:
糟糕!
我完全不知道这是什么原因。搜索 SO 和 Google 没有找到任何结果。
我尝试过的
我尝试在 collectionVC.m 文件中实现此方法:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super blahblah];
[[self.collectionView collectionViewLayout] invalidateLayout];
}
虽然即使我在 detailView 上也会调用它,但它并没有解决问题。
备注:
- 除了上面我 post 编辑的两个 post 之外,我没有实施任何与方向相关的 should/will/did 方法。
- 我注意到的一件事是 collectionView 正在切换到 2 列布局。似乎它的视图范围混淆了。
很抱歉 post。这是一个土豆。
所以有没有想过哪里出了问题??
更新 : 我抓了一个 screenshot of the UI hierarchy,可能会有帮助。
您面临的问题是当集合 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];
}
感谢 Ismail's ,它让我走上了正确的道路,我终于明白了:
仔细观察代码后,我做了一些观察:
首先,UICollectionViewController
正确地适应了旋转,viewWillTransitionToSize:
和 updateViewConstraints
被正确调用。 3 column/2 列切换也正常进行,所有必需的数据源方法都被调用。
所以它不是 CollectionViewController
然后我仔细查看了视图层次结构(图片link在我的问题末尾)。
有趣的是,tabBar 控制器仍然认为它是纵向的,而它上方和下方的所有内容都已切换为横向。标签栏和所有内容仍然是纵向宽度。
所以我刚刚在 CollectionViewController
的 viewDidAppear
方法中添加了这个:
-(void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.tabBarController.view setNeedsDisplay];
}
更好的是,我将 TabBar 控制器子类化并添加了这个:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.view setNeedsLayout];
}
成功了!
我仍然不知道为什么会这样。所以我会投资,当我发现更多时会更新我的答案。
我的设置
我有一个 UICollectionViewController
,它在纵向 中显示 2 列,在横向 中显示 3 列,就像这样:
我正在使用此代码在旋转时触发布局刷新:
- (void)updateViewConstraints
{
[super updateViewConstraints];
[[self.collectionView collectionViewLayout] invalidateLayout];
}
一切正常,但是...
问题
1. 我正在纵向查看 collectionView :
一切都很好。
2. 我点击其中一个单元格进入详细视图,它也支持两个方向。然后在详细视图中,我 将方向切换为横向 。还是不错的。
3. 仍然在风景中,我现在点击 < back
返回到 collectionView,然后这就是我看到的:
我完全不知道这是什么原因。搜索 SO 和 Google 没有找到任何结果。
我尝试过的
我尝试在 collectionVC.m 文件中实现此方法:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super blahblah];
[[self.collectionView collectionViewLayout] invalidateLayout];
}
虽然即使我在 detailView 上也会调用它,但它并没有解决问题。
备注:
- 除了上面我 post 编辑的两个 post 之外,我没有实施任何与方向相关的 should/will/did 方法。
- 我注意到的一件事是 collectionView 正在切换到 2 列布局。似乎它的视图范围混淆了。
所以有没有想过哪里出了问题??
更新 : 我抓了一个 screenshot of the UI hierarchy,可能会有帮助。
您面临的问题是当集合 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];
}
感谢 Ismail's
仔细观察代码后,我做了一些观察:
首先,UICollectionViewController
正确地适应了旋转,viewWillTransitionToSize:
和 updateViewConstraints
被正确调用。 3 column/2 列切换也正常进行,所有必需的数据源方法都被调用。
所以它不是 CollectionViewController
然后我仔细查看了视图层次结构(图片link在我的问题末尾)。
有趣的是,tabBar 控制器仍然认为它是纵向的,而它上方和下方的所有内容都已切换为横向。标签栏和所有内容仍然是纵向宽度。
所以我刚刚在 CollectionViewController
的 viewDidAppear
方法中添加了这个:
-(void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.tabBarController.view setNeedsDisplay];
}
更好的是,我将 TabBar 控制器子类化并添加了这个:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.view setNeedsLayout];
}
成功了!
我仍然不知道为什么会这样。所以我会投资,当我发现更多时会更新我的答案。