Как включить/выключить автоматическую компоновку для одного контроллера представления в раскадровке

Я хочу включить/выключить автоматическую компоновку для одного контроллера вида в раскадровке (так называемая сцена, которую я считаю)

Когда я перехожу на конкретную сцену в раскадровку и меняю флажок Use Auto Layout в инспекторе, я включаю/отключу автомасштабирование для всех сцен раскадровки.

Я не могу понять это поведение, потому что для одного этот флажок выглядит как свойство конкретной сцены, а не всей раскадровки, а во-вторых, я не понимаю, почему один сценарий сцены имеет какое-то отношение к другим сценам.

Возможно ли это? Возможно ли это в раскадровке или, может быть, только в коде?

Ответы

Ответ 1

Может показаться, что флажок "Использовать автоматическую компоновку" предназначен для определенной сцены, но, как вы обнаружили, это для всего "Документа по созданию интерфейса" (т.е. всей раскадровки). Таким образом, если вы не хотите использовать автоматическую компоновку на определенной сцене, вы застряли в нескольких альтернативах:

  • Вы можете поместить эту другую сцену в другую раскадровку или NIB и программно перейти к контроллеру и из контроллера просмотра. Вы теряете много преимуществ раскадровки, если вы это делаете (например, вы не можете просто создавать segues взад и вперед в IB, а скорее должны перейти на и с этой сцены программно).

  • Вы можете сохранить автоматическую компоновку, но затем для одного рассматриваемого контроллера, вы можете программно:

    • Удалите любые ограничения, которые IB может добавить (esp в Xcode 6);

    • Отрегулируйте autoresizingMask для различных элементов управления. Если вы хотите, чтобы ваш autoresizingMask был удостоен чести, вы можете включить translatesAutoresizingMaskIntoConstraints; и

    • Если вы используете Xcode 6, вам может понадобиться отключить "Use Size Classes", чтобы вы правильно отложили сцену для целевого устройства.

    Итак, выложив мой ярлык так, как я хотел в IB, я мог бы тогда:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self.view removeConstraints:self.view.constraints];
        [self.label removeConstraints:self.label.constraints];
        self.label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
        self.label.translatesAutoresizingMaskIntoConstraints = YES;
    }
    

    Ясно, что то, что вы установили autoresizingMask, полностью зависит от вас (в этом примере я помещал метку в центр внимания на сцену, поэтому приведенное выше сохраняет ее в центре, когда я иду в пейзаж), но, надеюсь, это иллюстрирует идею.

Откровенно говоря, учитывая, что вы ничего не можете сделать с автоизображением масок, которые вы не можете легко выразить в макете авто, я бы склонен придерживаться автоматической компоновки, и вы устраняете неловкость вышеупомянутых подходов.

Ответ 2

Вы можете переместить свой единственный контроллер контроллера вида в отдельный файл xib и загрузить его программно. И если вы просто не хотите определять свои собственные ограничения, вы можете оставить свой контроллер в раскадровке и просто не добавлять к нему ограничений. В этом случае ограничения будут автоматически генерироваться для вас во время выполнения на основе кадров дочерних просмотров VC.