Что такое «ограничить маржу» в раскадровке в Xcode 6

249

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

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

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

С Ограничением на маржу проверил

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

С ограничением для разрыва UnChecked

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

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

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

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

Бхумит Мехта
источник
15
Не нужно извиняться - не очевидно, что это вообще делает.
Бен Клейтон,
4
+1 не нужно извиняться, я тоже хотел задать этот вопрос. Кстати: чтобы открыть раскадровку в Xcode5, взгляните на: stackoverflow.com/a/25298909/529243
Олаф
1
Это самое близкое объяснение, которое я нашел: stackoverflow.com/questions/25275901/…
Натаниэль
Как это отключить?
Оркенштейн
2
Да, это настоящая боль. Я не смог выяснить, как снять это навсегда.
Бхумит Мехта

Ответы:

315

Я вообще не понимаю, почему люди жалуются на то, что « Поля могут вызвать прямой сбой на чем-либо до iOS 8 ».

Настройка ваших ограничений по отношению к краю в файле XIb или раскадровки НЕ сделать ваше приложение аварии на iOS7, и он НЕ делает разницу UI на устройстве iOS7 ни, до тех пор , пока вы не коснуться UIView.layoutMarginsи UIView.preservesSuperviewLayoutMarginsсвойства в вашем коде.

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

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

введите описание изображения здесь

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

Вы можете заставить IB отображать поля с помощью Editor> Canvas> Show Layout Rectangles: введите описание изображения здесь

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

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

Единственный способ использовать поля в Интерфейсном Разработчике - установить флажок Относительно поля при настройке ограничений. Вот как вы указываете ограничение « Использовать поля вместо краев» при разметке моего вида.

введите описание изображения здесь

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

Что хорошего в марже

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

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

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

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

введите описание изображения здесь

Скотт Чжу
источник
Спасибо за подробное объяснение. Я отмечаю это как принятый ответ, поскольку это хорошо объясняет вещи.
Бхумит Мехта
Спасибо @Bhumit, надеюсь, этот ответ поможет.
Скотт Чжу
4
«Я вообще не понимаю, почему люди жалуются». Ну, может быть, поведение изменилось с одной из последних бета-версий, я не проверял. Но по крайней мере несколько месяцев назад это вызвало сбой, даже если вы не пытались установить layoutMargins в коде.
KPM
Стоит отметить, что при добавлении новых ограничений новые версии XCode позволяют снять флажок «Constrain to Margins», который устанавливает тот же флаг «Relative to Margins». Это полезно, потому что это экономит несколько кликов! Отличный ответ, кстати, так хорошо объяснил, и изображения были очень полезными.
EricWasTaken
Я отметил, что фотографии размещены на Dropbox. Не лучше ли разместить изображения на SO?
тестирование
63

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

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

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

KPM
источник
21
Это было бы неплохой функцией, если бы она не была включена по умолчанию и все же вызывала полный сбой на чем-либо до iOS 8.
TylerJames
1
Не могу согласиться больше.
KPM
42

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

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

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

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

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

Кайл Робсон
источник
3
Это, наверное, лучшее решение, которое я там нашел. Снятие флажка «Содержать на полях» не всегда работает и кажется немного волшебным. Это потрясающе.
Леви МакКаллум
Почему по умолчанию это не 10pt?
ZaBlanc
11
У Apple есть история выбора длин и размеров, основанная на исследовании юзабилити, а не на выборе чисел, которые мы предпочитаем читать. Например, высота по умолчанию для многих вещей составляет 44 или 35 пунктов. @ZaBlanc
Кайл Робсон
Идеальное решение, когда я добавляю ограничение на раскадровку по умолчанию. Спасибо!
Иникс