具有大小类的iOS8自动布局在预览中工作,但在设备/模拟器中不起作用

时间:2015-07-08 17:56:36

标签: ios ios8 xcode6 autolayout size-classes

我正在尝试使用大小类的自动布局。我有一个基本的页面,UIImageView作为背景和UIButton(图像作为背景)。总共有6个约束:UIImageView和X中心对齐的顶部/右侧/底部/左侧空间为0,UIButton顶部空间为230。以下是界面构建器的外观: Interface Builder

她是预览的样子: Interface Builder preview

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

我无法弄清楚为什么没有执行约束? 我应该提一下,当我尝试在 .xib 文件中设置自动布局时会遇到这种情况。如果我尝试在具有故事板的项目中做同样的事情,那么一切似乎都是为了模拟器和真实设备。

1 个答案:

答案 0 :(得分:3)

如何从xib加载视图?

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

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

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

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

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