it-swarm.com.ru

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

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

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

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

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

15
Mario

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

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

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

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

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

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

    Итак, выложив свой лейбл так, как я хотел в 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, полностью зависит от вас (в этом примере я поместил метку в центре сцены, поэтому вышеизложенное сохраняет ее в центре, когда я перехожу к ландшафту), но, надеюсь, это иллюстрирует идею.

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

24
Rob

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

0
NRitH