Новый 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, которое не отключает это поведение, является приложением "Настройки".