Предоставление представлениям той же позиции в языке визуального форматирования
В языке визуального форматирования есть способ сохранить два элемента в одной позиции на одной оси?
Например, у меня есть 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.
Однако для предложенного вами варианта использования вы должны будете описать ограничения в нескольких выражениях:
- Установите горизонтальное сходство
field
а такжеlabel
- Установите вертикальное пространство 40 пикселей от вершины суперпредставления к полю, а 10 пикселей -
otherStuff
В общем, все, что требуется, - это то, что для каждого подпредставления все 4 необходимых значения размещения (x, y, ширина и высота) определены однозначно.
Мой общий подход к Autolayout с помощью кода заключается в написании пользовательской библиотеки с методами, которые выполняют те же действия, что и отдельные ограничения в Interface Builder. Вот некоторые примеры сигнатур методов:
+(void)addFixedHeightConstraintToView:(UIView*)view height:(CGFloat)height;
+(void)addTopMarginFromSuperviewConstraintToView:(UIView*)view topMargin:(CGFloat)topMargin;
+(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];