Высота панели инструментов iOS зависит от начальной ориентации - PullRequest
0 голосов
/ 05 января 2019

У меня проблемы с нижней панелью UIToolbar на iPhone. Высота полосы, по-видимому, зависит от ориентации устройства во время перехода к сцене и не обновляется при изменении ориентации.

  1. Когда я перемещаюсь к сцене в портретном режиме, нижняя полоса имеет высоту 44. Когда я поворачиваю телефон (здесь iPhone XR), высота полоски остается 44.
  2. Когда я открываю сцену в ландшафтном режиме, высота нижней полосы равна 49, а при повороте телефона в вертикальное положение остается 49.

Это можно легко воспроизвести с помощью простого приложения с двумя сценами, такого как это: demo app

Изначально это не было проблемой - пользователь даже не заметил бы небольшое изменение. Но теперь я использую нижнюю панель в режиме разделения. Когда он первоначально открывается в портретной ориентации, нижняя панель инструментов имеет высоту 44. Превращая телефон в альбомную ориентацию, открывается подробный вид с собственной панелью инструментов высотой 49. Затем у меня есть две панели инструментов с разной высотой прямо рядом друг с другом, что довольно уродливо: different toolbar heights in splitview

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

Я использую Xcode 10.1, запускаю приложение на iPhone с iOS 12.1.2.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

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

Контроллер навигации управляет высотой панели инструментов при вращении. Добавление следующего к методу viewDidLoad () покажет панель инструментов navigationController.

navigationController?.setToolbarHidden(false, animated: false)

Этот подход требует немного меньшего количества кода, чем если бы ваш контроллер представления управлял панелью инструментов (один метод меньше, а один - меньше).

Вот шаблон по умолчанию, который я сделал для проверки правильности отображения панели инструментов на iPad и модели iPhone Max: https://github.com/joelesli/TBHeight/

iPad Pro enter image description here

iPhone XS Max enter image description here

iPad Air 2 enter image description here

iPhone 8 Plus enter image description here

0 голосов
/ 05 января 2019

Первоначально я решил эту проблему (основываясь на комментарии Моча выше), переопределив viewWillTransition(...), чтобы перерисовать панель инструментов и принять значения по умолчанию для каждой ориентации.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if let bBar = bottomBar { bBar.invalidateIntrinsicContentSize() }
}

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

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

...