iOS8 大小为 类 的自动布局在预览中有效但在 device/simulator 中无效

iOS8 auto layout with size classes works in preview but not in device/simulator

我正在尝试使用大小为 类 的自动布局。我有一个以 UIImageView 作为背景和 UIButton(以图像为背景)的基本页面。总共有 6 个约束:0 space for top/right/bottom/left for UIImageView and X center align 和 230 for top space on UIButton。这是界面构建器的样子:

她是预览图的样子:

然而,这是我在模拟器(或设备)上 运行 应用程序时得到的:

我不明白为什么约束没有被执行? 我应该提一下,当我尝试在 .xib 文件中设置自动布局时会遇到这种行为。如果我尝试在有情节提要的项目中做同样的事情,模拟器和真实设备似乎一切正常。

您如何从 xib 加载视图?

例如假设您的视图位于名为 View.xib 的文件中,我可以使用

重现您的问题
- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *v = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil][0];
    [self.view addSubview:v];
}

这不起作用的原因是因为没有告诉自动布局定位和调整视图大小以填充屏幕,所以视图刚好适合它的内容 - 这将是背景图像的大小(因为您有将图像固定到其父视图的约束)。

要修复它,首先通过设置 translatesAutoresizingMaskIntoConstraints = NO 确保视图使用自动布局(否则,从 XIB 加载时默认为 YES),然后将视图固定到其父视图:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *v = [[NSBundle mainBundle] loadNibNamed:@"View" 
                                              owner:self
                                            options:nil][0];
    [self.view addSubview:v];

    v.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addConstraints:
      [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|"
                                              options:0 
                                              metrics:nil
                                                views:@{@"view": v}]];
    [self.view addConstraints:
      [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|"
                                              options:0
                                              metrics:nil
                                                views:@{@"view": v}]];
}