pop segue

时间:2016-01-12 09:14:22

标签: ios objective-c uicollectionview uiinterfaceorientation

我的设置

我有UICollectionViewController在肖像中显示 2列,在横向中显示 3列,如此:

Portrait Orientation。 。 。 。 Landscape Orientation

我正在使用此代码触发旋转时的布局刷新:

- (void)updateViewConstraints
{
    [super updateViewConstraints];
    [[self.collectionView collectionViewLayout] invalidateLayout];
}

一切都很好,但是......

问题

1。我正在查看Portrait中的collectionView:

Portrait Orientation

一切都很好。

2。我点击其中一个单元格转到详细视图,该视图也支持两种方向。然后在详细视图中,我将方向切换为横向。还是不错的。

3。仍然在风景中,我现在点按< back返回到collectionView,然后这就是我看到的内容:

The error OOPS!

我完全不知道这是什么原因。搜索SO和谷歌没有发现任何事情。

我尝试过什么

我尝试在collectionVC.m文件中实现此方法:

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

虽然即使我在detailView上也会调用它,但它并没有解决问题。

注意:

  1. 除了上面发布的两个方法之外,我没有实施任何与方向相关的应该/将要做的方法。
  2. 我注意到的一件事是collectionView正在切换到2列布局和全部。它的视角似乎正在变得混乱。
  3. Potato很抱歉这篇长篇文章。这是一个土豆。

    那么对于出了什么问题的任何想法?

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

2 个答案:

答案 0 :(得分:3)

您遇到的问题是当集合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];
     }

答案 1 :(得分:0)

感谢IsmailAnswer,这让我走上了正确的道路,终于弄明白了:

仔细观察代码后,我做了一些观察:

首先,UICollectionViewController正在适应旋转,viewWillTransitionToSize:updateViewConstraints在提示上被调用。 3列/ 2列切换也正常进行,所有必需的数据源方法都被调用。

所以它不是CollectionViewController

然后我仔细研究了视图层次结构(问题末尾的图像链接)
有趣的是,tabBar控制器仍然认为它是纵向的,而它上面和下面的所有东西都已切换到横向。标签栏和所有仍然是纵向宽度。

所以我刚刚在CollectionViewController的{​​{1}}方法中添加了这个:

viewDidAppear

<击>

甚至更好,我将TabBar控制器子类化并添加了这个:

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.tabBarController.view setNeedsDisplay];
}

这就是诀窍!

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