Автоматические понятия расположения
Фундаментальный стандартный блок в Автоматическом Расположении является ограничением. Ограничительный экспресс управляет для расположения элементов в Вашем интерфейсе; например, можно создать ограничение, указывающее ширину элемента или ее горизонтальное расстояние от другого элемента. Вы добавляете и удаляете ограничения или изменяете свойства ограничений, для влияния на расположение интерфейса.
При вычислении позиций во время выполнения элементов в пользовательском интерфейсе Автоматическая система Расположения рассматривает все ограничения одновременно и устанавливает позиции таким способом, лучше всего удовлетворяющим все ограничения.
Ограничительные основы
Можно думать об ограничении как о математическом представлении человеческого-expressable оператора. При определении позиции кнопки, например, Вы могли бы хотеть сказать, что “левый край должен быть 20 точками от левого края его содержания представления”. Более формально это переводит в button.left = (container.left + 20)
, который поочередно является выражением формы y = m*x + b
, где:
y
иx
атрибуты представлений.m
иb
значения с плавающей точкой.
Атрибут является одним из left
, right
, top
, bottom
, leading
, trailing
, width
, height
, centerX
, centerY
, и baseline
.
Атрибуты leading
и trailing
совпадают с left
и right
для слева направо языков такой столь же английский, но в справа налево среде, таких как иврит или арабский язык, leading
и trailing
совпадают с right
и left
. Когда Вы создаете ограничения, leading
и trailing
значения по умолчанию. Необходимо обычно использовать leading
и trailing
для проверки интерфейс размечается соответственно на всех языках, если Вы не делаете ограничения, которые должны остаться тем же независимо от языка (такого как порядок ведущего устройства и подробных областей в представлении разделения).
Ограничениям можно было установить другие свойства:
Постоянное значение. Физический размер или смещение, в точках, ограничения.
Отношение. Автоматическое Расположение поддерживает больше, чем просто постоянные значения для атрибутов представления; можно использовать отношения и неравенства такой как больше, чем или равняться, чтобы указать, например, что представление
width >= 20
, или даже этоtextview.leading >= (superview.leading + 20)
.Приоритетный уровень. Ограничения имеют приоритетный уровень. Ограничения с более высокими приоритетными уровнями удовлетворены перед ограничениями с более низкими приоритетными уровнями. Приоритетный уровень по умолчанию требуется (
NSLayoutPriorityRequired
), что означает, что ограничение должно быть удовлетворено точно. Система расположения становится настолько близкой, как она может к удовлетворению дополнительного ограничения, даже если она не может полностью достигнуть его.Приоритетные уровни позволяют Вам выражать полезное условное поведение. Например, они используются для выражения, что некоторые средства управления должны всегда измеряться для адаптации их содержанию, если что-то более важное не должно иметь приоритет. Для получения дополнительной информации о приоритетных уровнях, посмотрите
NSLayoutPriority
.
Ограничения кумулятивны, и не переопределяют друг друга. Если у Вас есть существующее ограничение, устанавливание другого ограничения того же типа не переопределяет предыдущий. Например, установка второго ограничения ширины для представления не удаляет или изменяет первое ограничение ширины — необходимо удалить первое ограничение вручную.
Ограничения, с некоторыми ограничениями, могут пересечь иерархию представления. В Почтовом приложении в OS X, например, по умолчанию кнопка Delete на панели инструментов выстраивается в линию с таблицей сообщений; в Настольных Предпочтениях флажки у основания окна выравниваются с областью просмотра разделения, на которую они воздействуют.
Вы не можете установить ограничение для пересечения иерархии представления, если иерархия включает представление, устанавливающее кадры подпредставлений вручную в пользовательской реализации для layoutSubviews
метод на UIView
(или layout
метод на NSView
). Также не возможно пересечь любые представления, имеющие, границы преобразовывают (такие как представление прокрутки). Можно думать о таких представлениях как барьеры — существует внутренний мир и внешний мир, но внутренняя часть не может быть подключена к внешней стороне ограничениями.
Внутренний размер содержания
Представления уровня листа, такие как кнопки обычно знают больше, о каком размере они должны быть, чем делает код, располагающий их. Это передается через внутренний размер содержания, говорящий системе расположения, что представление содержит некоторое содержание, которое это исходно не понимает и указывает, как большой, который содержание, внутренне.
Для элементов, таких как текстовые метки, необходимо обычно устанавливать элемент, чтобы быть его внутренним размером (выберите Editor> Size To Fit Content). Это означает, что элемент будет расти и уменьшаться соответственно с различным содержанием для различных языков.
Архитектура приложения
Автоматическая архитектура Расположения распределяет ответственность за расположение между контроллерами и представления. Вместо того, чтобы писать всезнающий контроллер, вычисляющий, куда представления должны пойти для данной геометрии, представления становятся большим количеством самоорганизации. Этот подход сокращает сложность логики контроллера и упрощает перепроектировать представления, не требуя соответствующих изменений в коде расположения.
Можно все еще хотеть объект контроллера, добавляющий, удаляющий или корректирующий ограничения во время выполнения. Для узнавания больше об управляющих ограничениях в коде считайте Работу с Автоматическим Расположением Программно.
Роль контроллера
Несмотря на то, что представление указывает свой внутренний размер содержания, пользователь представления говорит, насколько важный это. Например, по умолчанию, кнопка:
Строго хочет обнять его содержание в вертикальном направлении (кнопки действительно должны быть своей естественной высотой),
Слабо обнимает его содержание горизонтально (дополнительное дополнение стороны между заголовком, и край внешней панели приемлем),
Строго сопротивляется сжатию или отсечению содержания в обоих направлениях
В пользовательском интерфейсе, содержащем две кнопки друг рядом с другом, например, это до контроллера, чтобы решить, как кнопки должны расти, если существует дополнительная комната. Должен только одна из кнопок расти? Оба должны расти одинаково? Или возможно пропорционально друг другу? Если нет достаточного количества комнаты для адаптации обеим кнопкам, не сжимаясь или отсекая содержание, одна кнопка должна быть усеченной сначала? Или оба одинаково? И т.д.
Вы устанавливаете приоритеты объятия и сжатия для a UIView
использование экземпляра setContentHuggingPriority:forAxis:
и setContentCompressionResistancePriority:forAxis:
(для NSView
, Вы используете setContentHuggingPriority:forOrientation:
и setContentCompressionResistancePriority:forAxis:
). По умолчанию весь UIKit-и AppKit-предоставленные представления имеют значение также NSLayoutPriorityDefaultHigh
или NSLayoutPriorityDefaultLow
.