Ваш UINavigationBar
, скорее всего, прикреплен к safeAreas представления. Здесь нужно учитывать несколько вещей:
Текущая настройка
В настоящее время ваше представление закреплено на вкладках безопасной области его суперпредставления. На iPhone X это:
UIEdgeInsets(top: 44, left: 0, bottom: 34, right: 0)
в Портрет
UIEdgeInsets(top: 0, left: 44, bottom: 21, right: 44)
в Пейзаж
Так что это именно то, где заканчивается ваше представление:
![введите здесь описание изображения](https://i.stack .imgur.com/crAJP.png)
Значения в safeAreaInsets.bottom
здесь не имеют значения, потому что navigationBar, скорее всего, не будет расширяться так далеко до нижней части своего супервизора.
Закрепление в супервизоре
Хорошо, теперь давайте прикрепим представление к краям его суперпредставления, а не к вставке безопасной области:
(сделайте это для всех трех краев, при необходимости изменив константу на 0)
Вот что у нас получается:
![введите здесь описание изображения](https://i.stack .imgur.com/ixmSJ.png)
Выглядит хорошо для пейзажа, но что не так с портретом? Обратите внимание, как кнопка панели находится внутри строки состояния. Что ж, система компоновки делает именно то, что вы ей говорите (если бы это было правдой все время, кодирование для iOS было бы проще простого :D). Он прикрепляет представление к самому верху своего суперпредставления, игнорируя любые layoutMargin
или safeAreaInsets
. Однако для UINavigationBar
это не то, что нам нужно. Мы хотим, чтобы содержимое строки начиналось с любого safeAreaInset.top
, чтобы оно, например, не мешало строке состояния.
Решение
Решение состоит в том, чтобы вернуть верхнее ограничение обратно к «относительно safeArea». Содержимое панели навигации теперь выглядит нормально. Чтобы расширить фон navigationBar вверх, вы устанавливаете делегат navigationBars (UINavigationBarDelegate
) и предоставляете следующую реализацию:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
Возвращая .topAttached
, вы указываете панели навигации расширять фон (размытие) вверх под строкой состояния.
Результат:
![введите описание изображения здесь](https://i.stack.imgur.com/JNDYb.png)
Обратите внимание, что в целом было бы лучше использовать UINavigationController
, если это возможно. Весь этот танец макета сделан за вас, плюс добавление простого UINavigationBar
к представлению не будет хорошо работать с большими заголовками. Им нужен навигационный контроллер, обеспечивающий логику свертывания и расширения.
Приложение
Несколько дополнительных замечаний по этой теме:
- Нам не нужно рассматривать левую и правую безопасные области здесь.
UINavigationBar
учитывает их и соответствующим образом вставляет свое содержимое. Это не работает для вертикальных вставок, поэтому мы должны проделать танец, описанный выше.
- Если присмотреться, то даже расположение на самой последней картинке не совсем правильное. Большой заголовок расположен слишком близко к левому краю. Чтобы обойти это, вам нужно будет отметить
Preserve Superview Margins
для панели навигации в раскадровке. Опять же, все эти вещи обрабатываются системой за вас, если вы просто используете UINavigationController
в первую очередь.
person
CodingMeSwiftly
schedule
12.03.2018