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 上也会调用它,但它并没有解决问题。

备注:

  1. 除了上面我 post 编辑的两个 post 之外,我没有实施任何与方向相关的 should/will/did 方法。
  2. 我注意到的一件事是 collectionView 正在切换到 2 列布局。似乎它的视图范围混淆了。

很抱歉 post。这是一个土豆。

所以有没有想过哪里出了问题??

更新 : 我抓了一个 screenshot of the UI hierarchy,可能会有帮助。

您面临的问题是当集合 viewController 不可见时确实发生了旋转。所以 updateViewConstraintsviewWillTransitionToSize: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 控制器仍然认为它是纵向的,而它上方和下方的所有内容都已切换为横向。标签栏和所有内容仍然是纵向宽度。

所以我刚刚在 CollectionViewControllerviewDidAppear 方法中添加了这个:

-(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];
}

成功了!

我仍然不知道为什么会这样。所以我会投资,当我发现更多时会更新我的答案。