Визуальный язык формата

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

Визуальный синтаксис формата

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

Стандартное пространство

[button]-[textField]

../Art/standardSpace.png
Ограничение ширины

[button(>=50)]

../Art/widthConstraint.png
Соединение с суперпредставлением

|-50-[purpleBox]-50-|

../Art/connectionToSuperview.png
Вертикальный макет

V:[topField]-10-[bottomField]

../Art/verticalLayout.png
Представления сброса

[maroonView][blueView]

../Art/flushViews.png
Приоритет

[button(100@20)]

../Art/priority.png
Равные ширины

[button1(==button2)]

../Art/equalWidths.png
Многократные предикаты

[flexibleButton(>=70,<=100)]

../Art/multiplePredicates.png
Полная строка расположения

|-[find]-[findNext]-[findField(>=20)]-|

../Art/completeLayout.png

Нотация предпочитает хорошую визуализацию по полноте expressibility. Большинство ограничений, которые полезны в интерфейсах реального пользователя, может быть выражено с помощью визуального синтаксиса формата, но существуют некоторые, которые не могут. Одно полезное ограничение, которое не может быть выражено, является фиксированным форматным соотношением (например, imageView.width = 2 * imageView.height). Для создания такого ограничения необходимо использовать constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:.

Визуальная грамматика строки формата

Визуальная грамматика строки формата определяется следующим образом (литералы показаны в code font; e обозначает пустую строку).

Символ

Заменяющее правило

<visualFormatString>

(<ориентация> :)?

(<суперпредставление> <соединение>)?

<представление> (<соединение> <представление>) *

(<соединение> <суперпредставление>)?

<ориентация>

H|V

<суперпредставление>

|

<представление>

[<viewName> (<predicateListWithParens>)?]

<соединение>

e |-<predicateList>-|-

<predicateList>

<simplePredicate> | <predicateListWithParens>

<simplePredicate>

<metricName> | <positiveNumber>

<predicateListWithParens>

(<предикат> (,<предикат>) *)

<предикат>

(<отношение>)? (<objectOfPredicate>) (@<приоритет>)?

<отношение>

==|<=|>=

<objectOfPredicate>

<постоянный> | <viewName> (см. примечание),

<приоритет>

<metricName> | <число>

<постоянный>

<metricName> | <число>

<viewName>

Проанализированный как идентификатор C.

Это должно быть ключом, отображающимся на экземпляр NSView в переданном словаре представлений.

<metricName>

Проанализированный как идентификатор C. Это должно быть ключом, отображающимся на экземпляр NSNumber в переданном метрическом словаре.

<число>

Как проанализировано strtod_l, с локалью C.

Если Вы делаете синтаксическую ошибку, исключение выдается с сообщением диагностики. Например:

Expected ':' after 'V' to specify vertical arrangement
V|[backgroundBox]|
 ^
 
A predicate on a view's thickness must end with ')' and the view must end with ']'
|[whiteBox1][blackBox4(blackWidth][redBox]|
                                 ^
 
Unable to find view with name blackBox
|[whiteBox2][blackBox]
                     ^
 
Unknown relation. Must be ==, >=, or <=
V:|[blackBox4(>30)]|
               ^