Атрибуты компоновки относительно поля макета в версиях iOS до 8.0

Что вызвало бы следующее предупреждение (и последующие проблемы с выравниванием на iOS 7)?

Атрибут недоступен: атрибуты макета относительно поля макета в версиях iOS до 8.0

Ответ 1

Отключить "Отклонение по умолчанию"

enter image description here

Ответ 2

Ни один из опубликованных ответов не решил проблему для меня. Но причина этого заключается в следующем: Xcode 6 создает ограничения, основанные на относительных границах по умолчанию. Те доступны только в iOS 8.0 и новее. Вы получаете эти предупреждения, когда ваша цель развертывания установлена ​​на iOS 7.0 или ниже.

Как я установил предупреждение:

  • Нажмите предупреждение в Xcode
  • Инспектор атрибутов откроет ограничение
  • Найдите элемент с запасом (см. снимок экрана)
  • Отключить Относительно параметра margin

Attribute inspector

Ответ 3

Снижая отметку флажка "Предпочитаю относительную маржу", вы не сможете попасть в ситуацию, когда вы получите это предупреждение.

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

Чтобы не перестраивать все мои ограничения, я прибегал к просмотру фактического файла .storyboard, и я искал такие ограничения:

<constraint firstItem="vId-..." firstAttribute="top" secondItem="In7-..." secondAttribute="topMargin" id="C0H-..."/>

Обратите внимание на "topMargin". Значения, оканчивающиеся на "Маржа", вызывают предупреждение. Я прошел и идентифицировал ограничения в файле таким образом, затем я удалил и повторно создал их в IB. После этого это предупреждение ушло.

Я подозреваю, что это также должно устранить некоторые несоответствия между обработкой ограничений iOS 7 и iOS 8, хотя я все еще сталкиваюсь с некоторыми различиями в поведении, даже после обращения ко всем предупреждениям Xcode.

Ответ 4

В настоящее время я в той же ситуации, когда создаю приложение в Xcode 6, которое предназначено для iOS7 и 8. Это предупреждение появляется, потому что ограничения относительно поля недоступны в iOS7, но они созданы по умолчанию в Xcode 6.

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

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

Ответ 5

Xcode 6 по умолчанию создает ограничения на основе относительных полей.

Итак, если вы хотите принудительно удалить все атрибуты базовых линий и не хотите искать все плохие ограничения в интерфейсе Buidler, чтобы поддерживать iOS 7, я могу порекомендовать этот способ

Чтобы найти и удалить все фиктивные строки с помощью "Базовой линии" в ограничениях, вы можете сделать это:

  • Закрыть Xcode
  • Откройте файл stroyboard в вашем любимом текстовом редакторе, который поддерживает regexp.
  • Найти и удалить из файла раскадровки все строки по шаблону: .*"baseline".*\n
  • Теперь сохраните файл и откройте его в Xcode
  • Исправить все появившиеся несоответствия: найти все предупреждения и нажать "Обновить ограничения для всех просмотров", чтобы сохранить исходное положение всех просмотров.
  • Profit!

UPD: Я обнаружил, что "базовые" ограничения также приводят к сбоям, но Xcode не показывает никаких предупреждений об этих ограничениях!

Исправить - удалить из файла раскадровки все строки по шаблону: .*"baseline".*\n

Ответ 6

Я взял не-программный подход.

Я знал, какой элемент управления представлением вызывает сообщение с пометкой 8.0. Итак, я пошел в список ограничений. У меня было 33. Я удаляю все, что вызывало сообщение с маркой 8.0. Я спустился до 20 (так что 11 был проблемой).

Выберите 32 более 33 удалений и посмотрите результат. Выберите 31 из 33 удалений и т.д. Естественно, когда сообщение все еще есть... удалите проблемный.

Поэтому для разрешения сообщения об ошибке мне потребовалось 5 минут.

Появились другие сообщения с ограничениями, но это не очень важно.

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

Это не то, что предлагается Xcode, но он будет выполнять эту работу.

В конце сделанный.

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

Использование "Создать моментальный снимок" в меню файла может помочь вам, если что-то пойдет не так.

Ответ 7

Подавление предупреждений: я прошел через все ограничения IB и удалил все, что сказал "First Baseline...". Это заставило все эти предупреждения уйти. Тем не менее, IB будет повторно вводить предупреждения, если вы "Добавьте отсутствующие ограничения" или "reset к предложенным ограничениям".

Возможная причина. Из нового проекта Xcode 6.1 я копирую/вставляю ViewControllers в Storyboard (лениво), используя "reset для предложенных ограничений". Затем изменилась цель проекта с 8.0 до 7.1. Это вызвало появление всплывающих предупреждений. Я заметил, что предупреждения были обнаружены только на некоторых моих мониторах ViewControllers, которые, я считаю, были теми, которые я скопировал/вставил в раскадровку.

Предложение. Если таргетинг 7.1, установите его перед использованием IB. Не копируйте/не вставляйте контроллеры просмотра в раскадровку. И будьте осторожны с "новыми предупреждениями" при работе в IB, поэтому, надеюсь, мы сможем подтвердить причину этой досады.