Автоматическая компоновка iOS8 с классами размеров работает в предварительном просмотре, но не в устройстве/симуляторе

Я пытаюсь использовать автоматическую компоновку с классами размеров. У меня есть базовая страница с UIImageView в качестве фона и UIButton (с изображением в качестве фона). Всего существует 6 ограничений: 0 пробелов сверху/справа/снизу/слева для UIImageView и выравнивания по центру X и 230 для верхнего пробела на UIButton. Вот как выглядит построитель интерфейса: Построитель интерфейса

Вот как выглядит предварительный просмотр: Предварительный просмотр Interface Builder

Однако вот что я получаю, когда запускаю приложение на симуляторе (или устройстве): Simulator

Я не могу понять, почему ограничения не выполняются? Я должен упомянуть, что такое поведение наблюдается, когда я пытаюсь настроить автоматическую компоновку в файле .xib. Если я попытаюсь сделать то же самое в проекте с раскадровкой, все будет в порядке для симулятора и реального устройства.


person mike.tihonchik    schedule 08.07.2015    source источник
comment
проверьте это.... stackoverflow.com/questions/30795783/ ... вам нужно указать ограничения, которые закрепили все ваши края xib с помощью контроллера представления в контроллере представления   -  person EI Captain v2.0    schedule 09.07.2015


Ответы (1)


Как вы загружаете представление из xib?

например Предполагая, что ваше представление находится в файле с именем 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}]];
}
person John Martin    schedule 09.07.2015
comment
Спасибо, я подумал, что это что-то с размерами представления, тем более, что у раскадровки было дополнительное представление внутри ViewController. - person mike.tihonchik; 14.07.2015