嵌套堆栈视图不会根据大小响应更改轴 class

Nested Stack View won't respond to changing axis based on size class

我有 4 个简单的视图,我想在 iPhone 上垂直 4x1(如果水平紧凑)或水平 2x2(如果有任何其他组合)。我还添加了 wC+vC 作为水平 2x2 因为 iPhone 横向是 wC+vC.

我的界面构建器布局如下所示:

当在 Google 助理中横向和纵向显示 iPhone 4 秒的预览时,我得到了我期望的结果:

但是!当我将模拟器用于任何 iPhone 并将其放入横向时,我得到:

无论我尝试什么,我都无法让 TopStack 和 BottomStack 都显示为水平。如果我删除底部堆栈,顶部变为水平。但是一旦底部堆栈开始起作用,顶部堆栈就没有响应。

我什至在 wC+ 的代码中尝试过这个vC:

-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
if( self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact && self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact ) {
    [self.TopStack setAxis:UILayoutConstraintAxisHorizontal];
    [self.BottomStack setAxis:UILayoutConstraintAxisHorizontal];
} else {
    [self.TopStack setAxis:UILayoutConstraintAxisVertical];
    [self.BottomStack setAxis:UILayoutConstraintAxisVertical];
}

}

当我调试时,我可以验证顶部堆栈实际上在 UILayoutConstraintAxisHorizontal 中,但没有正确显示。

有没有人知道哪里出了问题??

这可能是 UIStackView 的一个持续错误。 iOS 9.0 的 beta 版本似乎也存在类似的问题,并且在嵌入式 UIStackViews:

方面可能仍然存在一些挥之不去的问题

http://useyourloaf.com/blog/adapting-stack-views-with-size-classes/

按照上面文章中的指示添加以下代码确实解决了这个问题,但代价是屏幕尺寸不可知并失去了一些使尺寸 类 有用的东西:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    if (size.width > size.height)
    {
        [self.topStack setAxis:UILayoutConstraintAxisHorizontal];
        [self.bottomStack setAxis:UILayoutConstraintAxisHorizontal];
    }
    else
    {
        [self.topStack setAxis:UILayoutConstraintAxisVertical];
        [self.bottomStack setAxis:UILayoutConstraintAxisVertical];
    }
}

演示Xcode工程可以下载from here.