Новый UINavigationBar внешний вид в детальной панели UISplitViewController в iOS 13 - PullRequest
10 голосов
/ 16 июня 2019

В iOS 13, если вы настраиваете прокручиваемый контроллер корневого представления (например, UITableViewController) в контроллере навигации, а затем помещаете этот контроллер навигации в панель сведений UISplitViewController, тогда фон панели навигации не виден, когда прокручиваемый контент находится вверху.

Вы можете увидеть это, создав новый проект iOS на основе шаблона Master / Detail. Затем измените раскадровку, чтобы использовать UITableViewController внутри контроллера Nav панели подробностей. Переведите устройство / симулятор в режим Light Appearance (проблема лучше, чем в Dark). Запустите приложение и обратите внимание, что область панели навигации имеет тот же цвет, что и фон представления таблицы. Теперь прокрутите таблицу вверх, и цвет навигационной панели изменится на стандартный светло-серый. Пусть табличное представление вернется к началу, и цвет навигационной панели снова исчезнет.

Я видел это только на панели подробностей контроллера разделенного представления.

Как отключить эту «функцию», чтобы навигационная панель выглядела нормально, как и любая другая навигационная панель, используемая где-либо еще, кроме панели сведений контроллера раздельного просмотра?

Нет соответствующих изменений API для UISplitViewController или UISplitViewControllerDelegate. В UINavigationController тоже ничего нет.

После некоторых копаний я нашел один обходной путь, но я бы хотел найти способ избежать этого.

Класс UINavigationBar теперь имеет несколько новых свойств для настройки его внешнего вида. Как ни странно, ни один из них не упоминается в разделе «Настройка внешнего вида панели навигации» в документации для UINavigationBar.

В iOS 13 появилось три новых свойства:

  • standardAppearance
  • compactAppearance
  • scrollEdgeAppearance

Все три типа UINavigationBarAppearance.

По умолчанию установлен только первый.

Даже если scrollEdgeAppearance равно nil, панель сведений контроллера разделения работает так, как если бы она была установлена ​​с backgroundColor, установленным на clear цвет.

Таким образом, обходной путь - добавить следующую строку в метод viewDidLoad корневого контроллера навигации контроллера:

navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance

Почему это нужно только в этом одном случае? Есть ли более правильное решение, кроме добавления этого кода?

Я заметил, что ни одно из приложений Apple (по крайней мере, «Почта», «Примечания» и «Файлы»), похоже, не использует эту «функцию».

1 Ответ

3 голосов
/ 11 июля 2019

Обнаруженный вами обходной путь - это «официальный» способ отключить это поведение, как объяснено в ветке в Twitter Дэвидом Дунканом, который работает в команде iOS System Experience в Apple.

для управления тем, что происходит, когда UINavigationBar полностью развернут, вы хотите установить scrollEdgeAppearance.Установив для StandardAppearance и scrollEdgeAppearance одинаковые значения, вы получите панель, которая не изменяется.

Приложение Apple, которое не отключает это поведение, - приложение «Настройки».

...