Auto Layout неправильно обрабатывает выемку iPhone X

Я реализовал pageViewIndicator в верхней части своего приложения, используя swift. Я постоянно проверял его на своем личном iPhone, который работал, но при использовании симулятора iPhone X я заметил, что он исчезает за выемкой просто потому, что я не указал, чтобы поместить его в безопасную зону или безопасную зону. еще не настроен должным образом. Вот сравнение:

pageController на iPhone 8 pageController на iPhone X

Кажется, что это простой вопрос, но в настоящее время я не нашел подходящей поддержки, как с этим справиться: основное предложение - настроить safeAreaInsets, но я не понимаю, как применить это к функциональности AutoLayout. Я попытался добавить ограничение topAnchor в pageController, но возможно ли отредактировать его с помощью базовой арифметики?

pageControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true

person Al E. Mone    schedule 03.02.2018    source источник
comment
используйте это решение, а затем проверьте hasNotch stackoverflow.com/a/68289931/7110147   -  person developper    schedule 07.07.2021


Ответы (3)


Ничего "подгонять" не надо. Весь смысл безопасной области заключается в том, что ее верхняя часть находится ниже строки состояния на iPhone, отличной от X, и ниже «выемки» на iPhone X. Для этого и предназначена безопасная область. .

Итак, просто прикрепите верхнюю часть элемента управления страницей к верхней части безопасной области. Вот как это выглядит на симуляторе iPhone 5s:

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

А вот как это выглядит на симуляторе iPhone X:

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

person matt    schedule 03.02.2018
comment
Это имеет смысл, но как его можно приколоть к безопасной зоне? Есть ли способ при определении Y-позиции назначить ее максимально возможной точке в пределах безопасной зоны? - person Al E. Mone; 03.02.2018
comment
Да, просто установите верхнюю часть элемента управления страницы равной верхней части безопасной области (константа нуля). Похоже, вы не знаете ничего об автомакете. Вам лучше начать узнавать об этом, потому что это очень важно, если вы хотите, чтобы ваш интерфейс работал на телефонах всех размеров. - person matt; 03.02.2018
comment
pageControl = UIPageControl(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 0)) — это код, который я применил для определения pageControl. Проблема с этим, однако, заключается в том, что он размещает pageControl для iPhone X прямо на краю ушей, прямо в центре, полностью игнорируя выемку. Присвоение значения y 50 приведет к тому, что оно будет находиться за пределами этой невидимой области, но сделает все остальные устройства визуально неподходящими. - person Al E. Mone; 03.02.2018
comment
Верно, потому что это не то, что я сказал делать. UIPageControl(frame: не автомакет. Он ничего не привязывает ни к чему. Узнайте об авторазметке. Попробуйте поискать в Google; это немного, но это начало. - person matt; 04.02.2018

Я нашел свою проблему, которую на самом деле я просто наблюдал: я забыл добавить

pageControl.translatesAutoresizingMaskIntoConstraints = false

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

let safeViewMargins = self.view.safeAreaLayoutGuide
pageControl.topAnchor.constraint(equalTo: safeViewMargins.topAnchor).isActive = true
pageControl.leadingAnchor.constraint(equalTo: safeViewMargins.leadingAnchor).isActive = true
pageControl.trailingAnchor.constraint(equalTo: safeViewMargins.trailingAnchor).isActive = true

Затем это отлично работало на всех устройствах.

person Al E. Mone    schedule 03.02.2018

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

Я не видел ограничения в Xcode, соответствующего «безопасной области», и не хотел залезать в кроличью нору, которая представляет собой динамическое позиционирование, поэтому моим решением было ограничить ориентацию портретной и альбомной справа (что означает выемку на слева).

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

Надеюсь, что через пару лет эта уродливая мода на выемки исчезнет.

person Community    schedule 29.05.2019