Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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];