При отладке автозапуска в том, что означает строки маскирования, такие как h = - & v = - & -?
Я думаю, они должны относиться к модели распорок и пружин, но я не могу найти их упоминания. При ограничении NSLog
они иногда появляются как строка описания недокументированного класса NSAutoresizingMaskLayoutConstraint
. Я заметил как минимум 3 разных типа: h=---
, h=--&
, h=-&-
с горизонтальной и вертикальной версиями.
Они очень часто появляются при отладке с помощью ограниченных макетов.
Ответы
Ответ 1
Если вы указываете автоматическую маскировку вместо ограничений или вообще не указываете ограничений, то в представлении будут ограничения NSAutoResizingMaskLayoutConstraint, а не NSLayoutConstraints. Если вы установите translatesAutoresizingMaskIntoConstraints
на NO
, то эти ограничения не отображаются. Вы не можете смешивать и сопоставлять на одном представлении, или вы получаете неудовлетворительные ошибки ограничения.
Я установил быстрый тестовый проект с различными комбинациями авторезистирующих масок, и формат ведения журнала довольно прост.
-
h=
или v=
указывает, что мы говорим о запретах в горизонтальном или вертикальном направлении.
-
-
указывает фиксированный размер
-
&
указывает на гибкий размер
- Порядок символов представляет маржу, размер, маржу
Следовательно, h=&-&
означает, что у вас есть левое и правое поля и фиксированная ширина, v=-&-
означает фиксированные верхние и нижние поля и гибкую высоту и т.д.
Ответ 2
Если вы смотрите видео WWDC 2012 в разделе "Лучшие практики для мастеринга автоматического макета", там есть раздел, где ведущий упоминает, что это синтаксис представлений, в которых используются маски авторезистировки и NOT. Там нет визуального формата, связанного с ними, например, для NSLayoutConstraint.
Ответ 3
Добавляя к ответу jrturton, лучшая информация, которую я нашел для понимания описаний ограничений, - это документация на языке Visual Format, которая требует создания ограничений в коде. Язык задокументирован как формальная грамматика, поэтому может потребоваться минута, чтобы все это поглотить.
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW1
Приведите пример:
<NSLayoutConstraint:0x10ada8a70 H:|-(44)-[UIButton:0x10ac5dc30] (Names: '|':UIView:0x10ac60470)>
Это ограничение горизонтальной ориентации (H:)
Связь составляет 44 пикселя от супервизора (|) до UIButton
Именованный супервизор - это UIView (Имена: '|': UIView:) - важно знать, потому что вам не нужно ограничивать непосредственный просмотр
Шестнадцать значений - это все действительные адреса ваших элементов интерфейса. Когда вы останавливаете точку во всех исключениях и приостанавливаете конфликт конфликта, вы можете использовать адрес po для просмотра объекта ограничения. В моем случае:
(lldb) po 0x10ac5dc30
<UIButton: 0x10ac5dc30; frame = (44 199; 30 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x10ac5ddf0>>
(lldb) po 0x10ac60470
<UIView: 0x10ac60470; frame = (0 64; 320 504); autoresize = RM+BM; animations = { position=<CABasicAnimation: 0x10ac5ec70>; bounds=<CABasicAnimation: 0x10ac62250>; }; layer = <CALayer: 0x10ac60530>>