Почему безопасная область раскадровки не работает правильно на iPhone X?

Я пытаюсь обновить свое приложение для нового iPhone X. Прочитав о функции безопасной области и флажке «Относительные поля безопасной области» в «Инспекторе размеров» каждого UIObject (вкладка линейки), я не думал, что это будет быть слишком плохим. Однако эта функция, похоже, не работает для меня.

Для обычных iPhone ничего не изменилось, и это хорошо, однако для X верхняя часть моего приложения перекрывает верхнюю вставку телефона на треть. Есть ли какой-нибудь известный способ исправить это * или что-то, что я упускаю?

* Под исправлением я имею в виду сделать так, чтобы мои объекты начинались ниже обнажения, как на втором изображении.

Что происходит:

Относительные поля безопасной области не работают

Желаемое поведение (из https://arstechnica.com/gadgets/2017/11/how-devs-updated-their-apps-for-the-iphone-xs-screen-and-the-notch/): Желаемое поведение Ограничения


person Prime624    schedule 28.11.2017    source источник
comment
Вы ничего не сказали нам о том, что вы на самом деле делаете, поэтому невозможно сказать, что вы делаете неправильно.   -  person matt    schedule 28.11.2017
comment
Я бы хотел, чтобы верхняя полоса начиналась чуть ниже черного обнажения, но это не так. Согласно описаниям безопасной зоны, которые я читал, она должна делать это автоматически, чего не происходит, несмотря на то, что я ее включил.   -  person Prime624    schedule 28.11.2017
comment
Как я уже сказал в вопросе, я установил флажок «Относительные поля безопасной области» в каждом из моих UIView. Это единственное, что я сделал, но это не то, что он говорит (делает поля относительно безопасной области). Что вы имеете в виду, используя его в ограничениях автомакета? Я не использую автоматический макет, потому что он не работал так, как рекламировалось, когда я начинал пару лет назад. Я хотел бы не переключаться, если это возможно, поэтому я спрашиваю здесь. Мои UIViews относятся к полям (например: x offset = 0).   -  person Prime624    schedule 28.11.2017


Ответы (2)


Я тоже потратил часы на это. И хотя я не могу ответить на ваш вопрос, почему это не работает в Xcode, я могу предложить решение.

Но сначала позвольте мне отметить, что в Xcode 11.3.1 у меня возникает та же проблема в новом проекте, созданном с нуля.

Настройте раскадровку:

  1. В раскадровке выберите «Использовать руководства по разметке безопасных зон». Это добавит безопасную область к каждому из ваших ViewController. Это также потребует от вас ориентироваться на iOS9+. Однако вы можете пропустить этот шаг (см. шаг 4 ниже).
  2. Просмотрите свою раскадровку как iPhone 4s.

Исправьте каждый ViewController:

  1. Выберите все представления в представлении верхнего уровня.
  2. Щелкните Редактор | Вставить в | Вид без вставки. Это создает новое представление и помещает все ваши представления внутрь.
  3. Make this new view expand to the safe area by adding safe area constraints (by control-dragging your new view onto the top level view).
    • Leading space to safe area
    • Верхнее пространство в безопасную зону
    • Скользящее пространство в безопасную зону
    • Нижнее пространство в безопасную зону
  4. Если вы не выбрали использование раскадровки безопасной области выше, вы можете создать четыре эквивалентных ограничения, используя Верхнее руководство по макету, Нижнее руководство по макету и левую/правую стороны представления верхнего уровня. Однако это может не работать в ландшафте. И я не тестировал это.
  5. Установите новый вид как прозрачный.
  6. Дайте вашему новому представлению имя, например «SafeAreaView».
person Ian    schedule 18.04.2020

В iOS 11 поля вставляются от безопасной области. Таким образом, ваше нулевое верхнее поле становится 20-ю верхними полями, что объясняет ваш снимок экрана. Если это не то, что вам нужно, установите для свойства insetsLayoutMarginsFromSafeArea представления значение false.

person matt    schedule 28.11.2017
comment
Это именно то, к чему я стремлюсь. К сожалению, как показано на первом рисунке, безопасная область перекрывает вставку. Мне нужно установить его вручную? - person Prime624; 28.11.2017
comment
Поскольку вы неоднократно не отвечали на мои неоднократные просьбы показать ваш код и рассказать, что вы делаете, я не могу продолжать дальше. Я не могу исправить код, который не вижу. - person matt; 28.11.2017
comment
1) Я рассказал вам все, что я делаю. У меня нет кода для этого, потому что я сделал это в редакторе раскадровки. - person Prime624; 28.11.2017
comment
Если вы сделали это в редакторе раскадровки, то вы должны были сделать это с ограничениями (до полей? до краев? что?). Но, опять же, вы не раскрыли, что это за ограничения (и фактически в какой-то момент вы отказались от использования ограничений, что меня смутило). - person matt; 28.11.2017
comment
Мои UIViews относятся к полям (например: x offset = 0). Итак, конкретно для верхней панели смещение по оси y относительно поля равно 0. - person Prime624; 28.11.2017
comment
Да, но это про у и вид сверху, не так ли? Это нежелание просто показать реальное представление в раскадровке и его ограничения, наряду с разницей между тем, что вы на самом деле получаете, и тем, что вы хотите, является самым загадочным. Именно так мы задаем вопросы здесь, в Stack Overflow. См. stackoverflow.com/help/mcve. - person matt; 28.11.2017