2014-10-02 3 views
10

У меня есть элемент пользовательского интерфейса (UISwitch фактически, но это не имеет значения), который имеет как ведущее, так и конечное пространство, прикрепленное к супервину в Interface Builder. Ограничение выглядит в Xcode 6:iOS8 Автоматическая компоновка программно привязана к относительной границе макета

Constraint pin

ограничения для ведущего пространства такого же эффективно. Значение ограничения: 42,0 балла.

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

Теперь я хочу добавить еще один вид в код, который также будет иметь как ведущее, так и конечное пространство, прикрепленное к его маркеру супервизора, поэтому будет работать тот же самый layoutMargins, установленный для супервизора.

Я приколол вид, используя визуальный язык формата со следующим синтаксисом:

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)]; 

[self.contentView addConstraints:constraints]; 
[self.contentView setNeedsUpdateConstraints]; 

Это работает, но layoutMargins свойство не имеет никакого эффекта, используя это ограничение, так что это явно не прижат к краю, но напрямую для наблюдения.

Так что мой вопрос:

Как прикрепить UI элементы пространства маржи в коде с помощью визуального языка форматирования? Или, если это невозможно, как подключить API constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:?

Спасибо!

ответ

14

В iOS8 язык визуальных форматов обновлен так, что «| -» или «- |» по умолчанию будет использовать интервал, определенный свойством layoutMargins супервизора.

Таким образом, ответ, используя визуальный язык формат выглядит следующим образом:

// programmatically set the layoutMargins, only if 
// you want non-default values and they are not already set in IB! 
self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42 

// assume: seperatorView is already a subview of self.contentView 

// separatorView will use the constraints because we write "-" between it and the superview edge 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)]; 
[self.contentView addConstraints:constraints]; 

Если вы хотите сослаться на поля макета при создании ограничений через прямой API, то вы используете новый iOS8 только атрибуты макета:

NSMutableArray * constraints = [NSMutableArray array]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeLeftMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeLeft 
    multiplier:1.0 
    constant:0]]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeRightMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeRight 
    multiplier:1.0 
    constant:0]]; 
[self.contentView addConstraints:constraints]; 
4

Я согласен, «в iOS8, визуальный язык формат был обновлен так, что„| -“или„- |“. будет по умолчанию, используя интервал, определяемый свойством layoutMargins в SuperView в»

Итак, вы должны указывать опцию «Constrains to margin», когда вы используете конструктор Interface, чтобы помочь вашему макету. Если это так, то это действительно работает.

Если проблема не была решена, не могли бы вы дать мне демонстрационный проект?

Добавлено: T his article whcih показать нам функцию новых iOS8 API сохраняетSuperviewLayoutMargins, желаем, чтобы это было более полезно.

Смежные вопросы