Новый UINavigationBar внешний вид в детальной панели UISplitViewController в iOS 13

В 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 ответ

Решение

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

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

Приложение Apple, которое не отключает это поведение, является приложением "Настройки".

Другие вопросы по тегам