Высота панели инструментов iOS зависит от начальной ориентации

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

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

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

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

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

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


person jerry    schedule 04.01.2019    source источник
comment
При изменении ориентации... обновите высоту панели инструментов .com/questions/38894031/ stackoverflow.com/questions/2135407/   -  person Mocha    schedule 05.01.2019
comment
Спасибо, @Mocha. Это может быть путь. Но, как я уже сказал, я хочу избежать жесткого кодирования высоты, так как это может вызвать другие проблемы. Предпочтительнее, чтобы панель инструментов, как и любой другой стандартный элемент, принимала свои естественные размеры для каждой ориентации. Я не уверен, но я бы посчитал это ожидаемым поведением по умолчанию. Итак, меня немного сбивает с толку тот факт, что размеры стандартного элемента по умолчанию зависят не от ориентации, а от НАЧАЛЬНОЙ ориентации.   -  person jerry    schedule 05.01.2019
comment
Это не на самом деле жесткое кодирование высоты, поскольку оно основано на высоте панели инструментов.   -  person Mocha    schedule 05.01.2019
comment
Да, вы правы (извините, я немного неправильно истолковал ваш комментарий в своем предыдущем ответе). Это один из вариантов. Если вы хотите добавить свой ответ, я буду рад отдать должное и удалить свой. Во всяком случае, ответ JoelEsli ближе к тому, что я искал.   -  person jerry    schedule 12.01.2019


Ответы (2)


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

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

navigationController?.setToolbarHidden(false, animated: false)

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

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

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

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

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

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

person JoelEsli    schedule 06.01.2019
comment
Правда, панель инструментов я добавил вручную. Это выглядит хорошо и гораздо меньше похоже на хак, чем то, что я придумал. Я попробую и дам вам знать. Спасибо! - person jerry; 07.01.2019
comment
Мои извинения. Я не был в офисе последние несколько дней. Я посмотрю, смогу ли я проверить это сегодня или самое позднее в выходные, а затем отмечу ответ. Это выглядит хорошо и очень ценится. - person jerry; 11.01.2019
comment
Проверено. Это прекрасно работает, и это именно то, что я искал. Спасибо за большие усилия, включая демонстрационный проект. - person jerry; 12.01.2019
comment
???????? Использование SDK — это самый простой способ. Рад, что это помогло. - person JoelEsli; 12.01.2019

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

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

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

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

person jerry    schedule 05.01.2019