Создание ограничений автоматического макета для topLayoutGuide и bottomLayoutGuide в коде

Документация Apple по созданию ограничений автоматического макета между представлением и одним из руководств по макету показывает только пример использования VFL .

Есть ли способ создать эти ограничения программно без VFL (используя другой API NSLayoutConstraint или аналогичный)?

(Примечание: я специально прошу об этом сделать в коде, а не в Interface Builder. И я не хочу, чтобы рассчитанная length указателя была задана как статическая константа в ограничении, я хочу ограничение, в котором изменения в руководстве по компоновке длина автоматически заставит ограниченное представление отрегулировать положение.)

Для UIButton который вы хотите разместить на 20 пунктов ниже UIViewController.topLayoutGuide вы создаете NSLayoutConstraint следующим образом:

 [NSLayoutConstraint constraintWithItem:self.button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20.0]; 

С iOS 9 вы также можете создать NSLayoutConstraint таким образом:

 [self.button.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor constant:20.0]; 

Чтобы добавить ответ @ JamieMcDaniel, версия Swift + iOS9 будет:

 self.button.topAnchor .constraintEqualToAnchor( self.topLayoutGuide.bottomAnchor ).active = true 

Не забывайте, что .active = true поскольку в противном случае ограничение не срабатывает автоматически.

Это сущность, которую я создал, вы должны встроить все свои подзоны в вид резервуара (контейнерный вид), добавленный в xib, он удаляет ограничения на просмотр циферблата-циферблата и добавляет верхние ограничения для topLayoutGuide, давая представление iOS6. Это может быть интересно, чего вы хотите достичь.

 //This should be added before the layout of the view - (void) adaptToTopLayoutGuide { //Check if we can get the top layoutguide if (![self respondsToSelector:@selector(topLayoutGuide)]) { return; } //tankView is a contaner view NSArray * array = [self.tankView referencingConstraintsInSuperviews]; //<--For this method get the Autolayout Demistified Book Sample made by Erica Sadun [self.view removeConstraints:array]; NSArray * constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide]-0-[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView, @"topLayoutGuide":self.topLayoutGuide}]; [self.view addConstraints:constraintsVertical]; NSArray * constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView}]; [self.view addConstraints:constraintsHorizontal]; } 

Просто добавление к @Jamie McDaniel, если это не сразу очевидно, вам нужно добавить ограничение, которое он предлагает создать:

 NSLayoutConstraint *buttonTopConstraint = [NSLayoutConstraint constraintWithItem:self.button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20.0]; [self.view addConstraint:buttonTopConstraint]; 
  • Распаковка отсутствует при каждом перезапуске Xcode
  • Autolayout + ограничения для динамической высоты таблицы на основе общих строк
  • Как заставить uitableview изменять размер ячейки (после деактивации ограничения по высоте)?
  • Почему я получаю «Автоматический макет, который все еще требуется после выполнения -layoutSubviews» при каждом запуске приложения?
  • Скрытие UIView с использованием ограничений AutoLayout
  • Как возможно, что высота UITableViewCellContentView отличается от heightForRowAtIndexPath:
  • Поймать UIViewAlertForUnsatisfiableConstraints в производстве
  • Почему, когда я перемещаю свой UILabel до определенного момента, он перемещается, когда я вхожу в полноэкранный режим?
  • Автомат не позволяет мне изменить центр представления
  • Автоматический макет: анимация изменений в множителе NSLayoutConstraint
  • Регулярное расстояние с помощью AutoLayout
  • Давайте будем гением компьютера.