Что такое "Ограничение маржи" в раскадровке в Xcode 6

Я работаю с autolayout и ограничениями и обнаружил, что есть опция Constrain to margins в Xcode 6, которая не присутствовала в Xcode 5 и проверена по умолчанию.

Я создал тестовый проект, затем добавил UITableView в ViewController с размером кадра, равным размеру представления, и добавил ограничения

Xcode 6 Здесь вы можете увидеть, даже если у tableview та же рамка, что и у представления. Xcode предлагает добавить -16 в качестве ограничения, тогда как Xcode 5 предлагает добавить интервал 0.

With Constrain to margin checked

Теперь, когда вы снимите флажок "Constrain to margin", он будет вести себя так же, как Xcode 5, и предложит добавить 0 в качестве ограничения

With Constrain to margin UnChecked

Кроме того, я обнаружил, что как только я добавляю ограничение с помощью Constrain к марке проверено, я больше не могу открыть файл раскадровки в Xcode 5, так что это определенно что-то новое в Xcode 6

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

РЕДАКТИРОВАТЬ

Я нашел кое-что о полях макета в обсуждении здесь, интересно, связано ли это с этим.

Ответ 1

Я вообще не понимаю, почему люди жалуются на то, что "Поля могут привести к краху на что-либо до iOS 8."

Установка ограничений относительно поля в файле xib или раскадровке НЕ ДЕЛАЕТ сделать ваш сбой приложения на iOS7, а НЕ сделать разницу в пользовательском интерфейсе на вашем устройстве iOS7 ни при условии, что вы не касаетесь свойств UIView.layoutMargins и UIView.preservesSuperviewLayoutMargins в своем коде.

Что такое поля в iOS8

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

enter image description here

По умолчанию a UIView имеет границы макета по 8 пунктов с каждой стороны, и это не может быть изменено в Конструкторе интерфейсов. Однако, установив свойство UIView.layoutMargins в коде, которое доступно только на iOS8, вы можете настроить эти значения.

Вы можете получить IB для отображения полей с помощью Редактоp > Холст > Показать прямоугольники макета: enter image description here

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

Как использовать поля

Единственный способ использования полей в Interface Builder - проверить параметр Относительно поля при настройке ваших ограничений. Так вы направляете свое ограничение на использование полей, а не краев при выделении моего представления.

enter image description here

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

  • Первый элемент (снимите галочку), второй элемент (проверка): В этом случае мы объявляем, что левый край субвью должен выравниваться с левым полем просмотра (как показано на этом изображении).

enter image description here

  1. Первый элемент (снимите флажок), второй элемент (снимите галочку): оба с использованием края, не margin. В этом случае мы объявляем, что левая кромка subview должна выровняться по левому краю супервизора.

enter image description here

  1. Первый элемент (проверка), второй элемент (снимите галочку): В этом случае мы объявляем, что левый край подзаголовка должен быть выровнен по левому краю супервизора. Этот вид компоновки фактически делает subview перекрытием супервизора.

enter image description here

  1. Первый элемент (проверка), второй элемент (проверка). Это фактически имеет тот же эффект, что и в случае 2, поскольку оба subview и superview имеют одинаковый разброс по умолчанию. Мы объявляем, что левая маржа subview должна быть выровнена с левой границей.

enter image description here

Что хорошего в полях

Эта новая функция (iOS8) влияет только на развитие пользовательского интерфейса, если вы решите использовать поля.

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

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

Чтобы проиллюстрировать это преимущество, в следующем случае все левые кромки subviews выровнены с их левым краем. Таким образом, изменение поля слева от просмотра будет влиять на все подпункты одновременно.

enter image description here

Ответ 2

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

Когда использовать его: когда вы хотите воспользоваться этой новой гибкостью.

Когда НЕ использовать его: для любого приложения, предназначенного для запуска на iOS 7 или ниже.

Ответ 3

Свойство UIView: layoutMargins. См. Документы Apple. В основном, если поля макета составляют 8,8,8,8 (по умолчанию), ограничение с 0 ведущим пробелом в поле контейнера будет иметь позицию x 8. Обратите внимание, что это доступно только на iOS8 или новее.

Для всех, кто не хочет, чтобы их ограничения попадали в поле контейнера:

CTRL + щелчок + перетащить, чтобы отобразить всплывающее окно создания ограничений.

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

Теперь он покажет возможность создания ограничения НЕ к марже. Это время быстрее в моем использовании.