Создание ограничений автоматического макета для topLayoutGuide и bottomLayoutGuide в коде
Apple documentation при создании ограничений автоматической компоновки между представлением и одним из руководств по макетам показан только пример с использованием VFL.
Есть ли способ создать эти ограничения программно без VFL (используя NSLayoutConstraint
другой API или аналогичный)
(Примечание. Я специально прошу об этом сделать в коде, а не в Interface Builder. И я не хочу, чтобы рассчитанный length
справочника был установлен как статическая константа в ограничении, мне нужно ограничение, изменения длины направляющей макета автоматически заставят ограниченное представление отрегулировать положение.)
Ответы
Ответ 1
Для 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];
Ответ 2
Чтобы добавить @JamieMcDaniel ответ, версия Swift + iOS9 будет:
self.button.topAnchor
.constraintEqualToAnchor( self.topLayoutGuide.bottomAnchor ).active = true
Не забывайте часть .active = true
, так как в противном случае ограничение не запускается автоматически.
Ответ 3
Это gist, который я создал, вы должны встроить все свои подзоны в вид резервуара (контейнерный вид) в 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];
}
Ответ 4
Просто добавление к @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];