Решение автоматических вопросов расположения

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

Идентификация проблем

Взаимодействуйте через интерфейс Разработчик выводит на экран Автоматические проблемы Расположения во многих различных местах:

В Навигаторе Проблем. Группы Навигатора выходят типом.

../Art/debug_navigator.png

В Интерфейсном Разработчике обрисовывают в общих чертах представление. Если существуют какие-либо проблемы в представлении верхнего уровня, что Вы редактируете на холсте, Интерфейсное представление схемы Разработчика показывает стрелку раскрытия. Эта стрелка является красной, если существуют конфликты или случаи неоднозначности, и желтые, если ограничения заканчиваются в поле зрения misplacement.

../Art/red_arrow_in_outline_view_2x.png

Щелкните по стрелке раскрытия, и Вы будете видеть список проблем, разделенных типом с информацией о соответствующих средствах управления и ограничениях. Щелкните по ошибке или предупреждению символа рядом с любой проблемой для наблюдения описания того, что происходит и рекомендуемый план действий.

../Art/debug_info_view.png

На холсте. Неуместные или неоднозначные ограничения показаны в оранжевых, конфликтных ограничениях, являются красными, и красные точечные кадры показывают предсказанные позиции во время выполнения неуместных или неоднозначных представлений; эти проблемы описаны в следующих разделах.

Разрешение представления Misplacement

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

Взаимодействуйте через интерфейс Разработчик показывает неуместные представления путем рисования ограничений, больше не удовлетворяющихся в оранжевом с misplacement дельтой. Это также выводит на экран точечный красный кадр, чтобы показать Вам, где представление будет во время выполнения.

../Art/misplacement.png
bullet
Разрешить misplacement

Выполнить одно из следующих действий:

  • Выберите Issues> Update Frames. Это заставляет элемент пятиться туда, где это было, прежде чем это было неуместно. Кадры изменяются для удовлетворения существующих ограничений.

  • Выберите Issues> Update Constraints. Это заставляет ограничения быть обновленными к новому расположению элемента. Ограничения изменяются для соответствия текущих кадров.

Разрешение ограничительных конфликтов

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

../Art/conflict.png
bullet
Разрешить ограничительный конфликт
  • Удалите одно из конфликтных ограничений.

Разрешение неоднозначности

Неоднозначность происходит ограничения при определении результата в многократных возможных решениях для размера и размещения представлений; это может быть то, потому что, например, существует недостаточно ограничений, или потому что размер содержания представления не определен.

Взаимодействуйте через интерфейс Разработчик показывает неоднозначность путем рисования кадров с оранжевыми границами; для узнавания больше о неоднозначности используйте навигатора Проблем. Путем Вы разрешаете неоднозначность, зависит от условия, это вызывает его.

../Art/ambiguity_no_vertical.png

Одно или более ограничений отсутствуют

В самом простом случае существует только недостаточно ограничений — например, Вы ограничили горизонтальную позицию элемента, но не добавляли ограничения для вертикальной позиции. Для разрешения неоднозначности необходимо добавить недостающие ограничения

bullet
Добавить недостающие ограничения
  • Выберите Issues> Add Missing Constraints.

Размер содержания не определен

Некоторые контейнерные представления — такие как представление штабеля — зависят от размера их содержания для определения их собственного размера во время выполнения, что означает, что размер неизвестен во время проектирования. Для рассмотрения этой проблемы необходимо установить ограничения заполнителя, такие как ширина минимума заполнителя для представления (этот заполнитель удален во время изготовления, когда представление определяет свой размер).

bullet
Создать ограничение заполнителя
  1. Добавьте желаемое ограничение как нормальное.

  2. Выберите ограничение, затем откройте инспектора Атрибутов.

  3. Установите флажок рядом с опцией Placeholder.

    ../Art/placeholder.png

Размер пользовательского содержания представления неизвестен

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

bullet
Установить заполнителя представления внутренний размер содержания
  1. С выбранным представлением откройте инспектора Размера.

    ../Art/size_inspector.png
  2. Под опцией Intrinsic Size выберите Placeholder.

  3. Установите надлежащие значения для ширины и высоты.

    ../Art/intrinsic_content_size.png

Отладка в коде

Вообще говоря существует две фазы к отладке проблемы расположения:

  1. Карта от “этого представления находится в неправильном месте” к “этому ограничению (или эти ограничения) (являются) неправильными”.

  2. Карта от “этого ограничения является неправильной” к “этому коду, является неправильным”.

bullet
Отладить проблему с Автоматическим Расположением
  1. Идентифицируйте представление с неправильным кадром.

    Это может быть очевидно, какое представление имеет проблему; если это не, можно счесть полезным использовать NSView метод _subtreeDescription создать текстовое описание иерархии представления.

  2. Если возможно, воспроизведите проблему при выполнении под шаблоном Auto Layout в Инструментах.

  3. Найдите плохое ограничение или ограничения.

    Для получения ограничений, влияющих на определенное представление, использовать constraintsAffectingLayoutForOrientation: в OS X или constraintsAffectingLayoutForAxis: в iOS.

    Можно тогда проверить ограничения в отладчике, распечатывающем ограничения с помощью визуальной нотации формата, описанной на Визуальном Языке Формата. Если Ваши представления имеют идентификаторы, они распечатываются в описании, как это:

    <NSLayoutConstraint: 0x400bef8e0 H:[refreshSegmentedControl]-(8)-[selectViewSegmentedControl] (Names: refreshSegmentedControl:0x40048a600, selectViewSegmentedControl:0x400487cc0 ) >

    иначе вывод похож на это:

    <NSLayoutConstraint: 0x400cbf1c0 H:[NSSegmentedControl:0x40048a600]-(8)-[NSSegmentedControl:0x400487cc0]>
  4. Если это не очевидно, какое ограничение является неправильным в этой точке, визуализируйте ограничения на экран путем передачи ограничений использованию окна visualizeConstraints:.

    При щелчке по ограничению оно распечатано в консоли. Таким образом Вы можете, можно определить, который является, который, и обычно идентифицируют, который является неправильным.

    В этой точке Вам можно сообщить, что расположение неоднозначно.

  5. Найдите код, это неправильно.

    Иногда, как только Вы идентифицировали неправильное ограничение, Вы будете знать, что сделать для фиксации его.

    Если дело обстоит не так, то используйте Инструменты для поиска указателя ограничения (или часть его описания). Это покажет Вам интересные события в жизненный цикл того ограничения — его создание, модификация, установка в окна, и т.д. Для каждого из них Вы видите след, где это произошло. Найдите этап, на котором спутались вещи, и смотрите на след. Это - код с проблемой.

Автоматическое расположение ухудшается корректно с невыполнимыми ограничениями

Это - программная ошибка для конфигурирования ограничений, которые не могут быть удовлетворены. Сталкивающийся с невыполнимыми ограничениями, однако, Автоматическая система Расположения пытается ухудшиться корректно.

  1. addConstraint: метод (или setConstant: метод NSLayoutConstraint) регистрирует взаимно невыполнимые ограничения и (потому что это - ошибка программиста), выдает исключение.

  2. Система сразу ловит исключение.

    Несмотря на то, что добавление ограничения, которое не может быть удовлетворено, является ошибкой программиста, это - ошибка, что можно с готовностью предположить происходить на компьютере пользователя, и с которого система может восстановиться более корректно, чем катастрофический отказ программы. Исключение выдается так, чтобы Вы заметили проблему, и пойманный, потому что проще отладить ограничительную систему, если действительно все еще функционирует система.

  3. Чтобы позволить расположению продолжаться, система выбирает ограничение из числа взаимно невыполнимого набора и понижает его приоритет от «требуемого» до внутреннего значения, не требующегося, но это - более высокий приоритет, чем что-нибудь, что можно внешне указать. Эффект состоит в том, что как вещи изменение продвижение, это неправильно поврежденное ограничение является первым, который система пытается удовлетворить. (Обратите внимание на то, что каждое ограничение в наборе требуется для начала, потому что иначе это не вызвало бы проблему.)

2010-08-30 03:48:18.589 ak_runner[22206:110b] Unable to simultaneously satisfy constraints:
(
  "<NSLayoutConstraint: 0x40082d820 H:[NSButton:0x4004ea720'OK']-(20)-|  (Names: '|':NSView:0x4004ea9a0 ) >",
  "<NSLayoutConstraint: 0x400821b40 H:[NSButton:0x4004ea720'OK']-(29)-|  (Names: '|':NSView:0x4004ea9a0 ) >"
)
 
Will attempt to recover by breaking constraint
<NSLayoutConstraint: 0x40082d820 H:[NSButton:0x4004ea720'OK']-(20)-|  (Names: '|':NSView:0x4004ea9a0 ) >