Работа с автоматическим расположением программно

Даже при том, что Интерфейсный Разработчик обеспечивает удобный визуальный интерфейс для работы с Автоматическим Расположением, можно также создать, добавить, удалить и скорректировать ограничения через код. Если Вы добавите или удалите представления во время выполнения, например, то необходимо будет добавить ограничения программно, чтобы гарантировать, что интерфейс правильно реагирует на изменения в размере или ориентации.

Создание ограничений программно

Вы представляете ограничения с помощью экземпляров NSLayoutConstraint. Для создания ограничений Вы обычно используете constraintsWithVisualFormat:options:metrics:views:.

Первый параметр этому методу, визуальной строке формата, обеспечивает визуальное представление расположения, которое Вы хотите описать. Этот визуальный язык формата разработан, чтобы быть максимально читаемым; представление представлено в квадратных скобках, и соединение между представлениями представлено с помощью дефиса (или два дефиса, разделенные числом для представления числа очков независимо, представления должны быть). Для большего количества примеров и изучить грамматику для визуального языка формата, посмотрите Визуальный Язык Формата.

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

../Art/twoButtons.png

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

[button1]-12-[button2]

Единственный дефис обозначает стандартное пространство Воды, таким образом, можно также представлять отношение как это:

[button1]-[button2]

Названия представлений происходят от views словарь — ключи являются именами, которые Вы используете в строке формата, и значения являются соответствующими объектами представления. Как удобство, NSDictionaryOfVariableBindings создает словарь, где ключи совпадают с именем переменной соответствующего значения. Код для создания ограничений становится:

NSDictionary *viewsDictionary =
                NSDictionaryOfVariableBindings(self.button1, self.button2);
NSArray *constraints =
        [NSLayoutConstraint constraintsWithVisualFormat:@"[button1]-[button2]"
                            options:0 metrics:nil views:viewsDictionary];

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

Как пример, Вы могли также использовать этот метод для создания ранее [button1]-[button2] ограничение:

[NSLayoutConstraint constraintWithItem:self.button1 attribute:NSLayoutAttributeRight
                      relatedBy:NSLayoutRelationEqual toItem:self.button2
                      attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-12.0];

Установка ограничений

Для создания ограничения активным необходимо добавить его к представлению. Представление, содержащее ограничение, должно быть наследователем представлений, которые ограничение включает и должно обычно быть самым близким общим предком. (Это находится в существующем NSView Наследователь значения слова API, где представление является наследователем себя.) Ограничение интерпретируется в системе координат того представления.

Предположим, что Вы устанавливаете [zoomableView1]-80-[zoomableView2] на общем предке zoomableView1 и zoomableView2.

../Art/helloHi-1.png

Значение 80 находится в системе координат контейнера, который является тем, на что это похоже, рисуете ли Вы ограничение.

Если границы преобразовывают любого из zoomable изменений представлений, пространство между ними остается фиксированным.

../Art/helloHi-2.png

Если границы преобразовывают в сам контейнер, изменяется, масштабы пространства, также.

../Art/helloHi-3.png

NSView обеспечивает метод —addConstraint:— добавить ограничение и методы, чтобы удалить или проверить существующие ограничения —removeConstraint: и constraints— а также другие связанные методы. NSView также обеспечивает метод, fittingSize, который подобен sizeToFit метод NSControl но для произвольных представлений, а не для средств управления.

fittingSize метод возвращает идеальный размер для представления, считая только те ограничения установленными на поддереве получателя вместе с предпочтением представления, чтобы быть как можно меньше. Подходящий размер не является «лучшим» размером для представления в общем смысле — в системе на основе ограничений, «лучший» размер представления (если Вы рассматриваете все), по определению его текущий размер.