Предоставление представлениям той же позиции в языке визуального форматирования

В языке визуального форматирования есть способ сохранить два элемента в одной позиции на одной оси?

Например, у меня есть UILabel и UITextField что я хочу рядом друг с другом по горизонтали. При изложении вертикальных ограничений есть ли в любом случае указание этого?

Примерно так было бы идеально:

|-40-([label][field])-10-[otherStuff]

...где [label] а также [field] оба имеют одинаковую позицию Y, но на 40 пунктов ниже вершины суперпредставления и 10 пунктов под ними [otherStuff],

Это возможно?

Или я должен вложить [label] а также [field] в их собственном UIView, а затем выложить это?

3 ответа

Решение

Язык визуального формата не поддерживает это само по себе. Во-первых, горизонтальное расположение и вертикальное расположение должны быть выполнены в двух отдельных строках. тем не мение +[NSLayoutConstraint constraintsWithVisualFormat:options:metrics:views:] принимает параметры, которые могут включать выравнивание.

Итак, вы можете использовать:

NSDictionary* views = NSDictionaryOfVariableBindings(field, label);
NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[label]-10-[otherStuff]" options:0 metrics:nil views:views];
[field.superview addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[label][field]" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views];
[field.superview addConstraints:constraints];

Во втором случае NSLayoutFormatAlignAllBaseline делает так, чтобы не только field след label, но они находятся в одинаковом вертикальном положении (в зависимости от их базовой линии, что, вероятно, лучше, чем выравнивание их центра, верха или низа).

Единственный способ, которым я знаю, - это использовать два визуальных утверждения формата 2, например:

|-40-[label]-10-[otherStuff]
|-40-[field]

К сожалению, это означает дублирование части первого утверждения.

Вложение в другое представление является решением.

Вы также можете добавить ограничения в код без использования языка визуального формата:

NSLayoutConstraint* fieldLeft = [NSLayoutConstraint constraintWithItem:field
           attribute:NSLayoutConstraintAttributeLeading
           relatedBy:NSLayoutRelationEqual 
           toItem:label 
           multiplier:1 constant:0];
[field.superview addConstraint:fieldLeft];

Подумайте об этом так: если вы можете сделать это с помощью Autolayout в Интерфейсном Разработчике, вы можете сделать это и с помощью Visual Format Language.

Однако для предложенного вами варианта использования вы должны будете описать ограничения в нескольких выражениях:

  1. Установите горизонтальное сходство field а также label
  2. Установите вертикальное пространство 40 пикселей от вершины суперпредставления к полю, а 10 пикселей - otherStuff

В общем, все, что требуется, - это то, что для каждого подпредставления все 4 необходимых значения размещения (x, y, ширина и высота) определены однозначно.

Мой общий подход к Autolayout с помощью кода заключается в написании пользовательской библиотеки с методами, которые выполняют те же действия, что и отдельные ограничения в Interface Builder. Вот некоторые примеры сигнатур методов:

  1. +(void)addFixedHeightConstraintToView:(UIView*)view height:(CGFloat)height;
  2. +(void)addTopMarginFromSuperviewConstraintToView:(UIView*)view topMargin:(CGFloat)topMargin;
  3. +(void)addHorizontalSpaceConstraintFromView:(UIView*)fromView toView:(UIView*)toView horizontalSpace:(CGFloat)hSpace;

Все эти методы определены с очень простым и понятным VFL. Получив их, я легко смогу решить описанный вами вариант использования. Вот пример кода:

[CustomAutoLayout addTopMarginFromSuperviewConstraintToView:field topMargin:40];
[CustomAutoLayout addTopMarginFromSuperviewConstraintToView:label topMargin:40];
[CustomAutoLayout addHorizontalSpaceConstraintFromView:field toView:label horizontalSpace:0];
[CustomAutoLayout addVerticalSpaceConstrantFromView:field toView:otherStuff verticalSpace:10];
Другие вопросы по тегам