При отладке автозапуска в том, что означает строки маскирования, такие как 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>>