Работа с автоматическим расположением программно
Даже при том, что Интерфейсный Разработчик обеспечивает удобный визуальный интерфейс для работы с Автоматическим Расположением, можно также создать, добавить, удалить и скорректировать ограничения через код. Если Вы добавите или удалите представления во время выполнения, например, то необходимо будет добавить ограничения программно, чтобы гарантировать, что интерфейс правильно реагирует на изменения в размере или ориентации.
Создание ограничений программно
Вы представляете ограничения с помощью экземпляров NSLayoutConstraint
. Для создания ограничений Вы обычно используете constraintsWithVisualFormat:options:metrics:views:
.
Первый параметр этому методу, визуальной строке формата, обеспечивает визуальное представление расположения, которое Вы хотите описать. Этот визуальный язык формата разработан, чтобы быть максимально читаемым; представление представлено в квадратных скобках, и соединение между представлениями представлено с помощью дефиса (или два дефиса, разделенные числом для представления числа очков независимо, представления должны быть). Для большего количества примеров и изучить грамматику для визуального языка формата, посмотрите Визуальный Язык Формата.
Как пример, Вы могли бы представлять ограничение между двумя кнопками:
использование следующей визуальной строки формата:
[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
.
Значение 80 находится в системе координат контейнера, который является тем, на что это похоже, рисуете ли Вы ограничение.
Если границы преобразовывают любого из zoomable изменений представлений, пространство между ними остается фиксированным.
Если границы преобразовывают в сам контейнер, изменяется, масштабы пространства, также.
NSView
обеспечивает метод —addConstraint:
— добавить ограничение и методы, чтобы удалить или проверить существующие ограничения —removeConstraint:
и constraints
— а также другие связанные методы. NSView
также обеспечивает метод, fittingSize
, который подобен sizeToFit
метод NSControl
но для произвольных представлений, а не для средств управления.
fittingSize
метод возвращает идеальный размер для представления, считая только те ограничения установленными на поддереве получателя вместе с предпочтением представления, чтобы быть как можно меньше. Подходящий размер не является «лучшим» размером для представления в общем смысле — в системе на основе ограничений, «лучший» размер представления (если Вы рассматриваете все), по определению его текущий размер.