2013-10-04 3 views
59

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

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

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

+0

Что такое VFL? Ссылка не работает ... –

ответ

89

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

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

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

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

Вы (половина?) справа. Ваш код действительно работает, но 'NSLayoutAttributeBaseline' не требуется, чтобы он работал. Если вы привязаны к 'topLayoutGuide',' NSLayoutAttributeBottom' работает одинаково (и 'NSLayoutAttributeTop' следует использовать, если, конечно, привязывать к' bottomLayoutGuide'). В любом случае ... Я думал, что пробовал этот подход раньше, и это не сработало ... Думаю, я что-то напортачил. – smileyborg

+0

Спасибо @smileyborg. Я также обновил свой ответ, чтобы включить новый API iOS 9. –

3

Это gist Я создал, вы должны встроить все свои подзоны в вид резервуара (контейнерный вид), добавленный в xib, он удаляет ограничения на просмотр циферблата-viewview и добавляет верхние ограничения для 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]; 

} 
+0

Извините, но это не касается моего конкретного вопроса. – smileyborg

+1

VLF - это способ пойти с автозапуском, я не могу найти какой-либо конкретной причины не использовать его, я только что предложил фрагмент кода, который мог бы помочь вам указать в правильном направлении. Если вы хотите подумать о Это. – Andrea

+2

VFL имеет собственный набор плюсов и минусов. Я лично не большой поклонник этого, поэтому я написал [эту категорию Auto Layout на UIView] (https://github.com/smileyborg/UIView-AutoLayout), которая решает еще больше случаев использования, чем VFL. Я даже написал некоторые плюсы и минусы всех подходов Auto Layout (включая VFL) в README этого проекта. – smileyborg

5

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

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

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

3

Просто дополнение к @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]; 
Смежные вопросы