Обновление
Мэтт правильно указал, что в моем исходном проекте произошла ошибка с восстановлением состояния.Однако даже после его удаления я могу воспроизвести проблему, если использую табличное представление внутри контроллера навигации и пытаюсь установить для свойства isTranslucent
для UINavigationBar
значение false
через прокси-сервер внешнего вида.
По какой-то причине, когда iOS восстанавливает состояние, UIAppearance переопределяет значения, установленные в viewDidLoad
.Это вызывает у меня много головной боли, и я хотел бы знать, как решить эту проблему.Я рассматриваю это как ошибку.
Здесь - это небольшой проект, который я создал на GitHub для иллюстрации этой проблемы.Когда вы запускаете его в первый раз, шрифт метки в ViewController
правильно установлен на 22 пункта.Однако, если вы инициируете восстановление состояния, это будет 12 баллов из-за метода появления в willFinishLaunching
.
На самом деле, причина этой проблемы не в UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).font = UIFont.systemFont(ofSize: 12)
, как я изначально думал.Вместо этого UINavigationBar.appearance(whenContainedInInstancesOf: [GLXNavigationController.self]).isTranslucent = false
вызывает такое поведение.Вы можете легко проверить это самостоятельно.
Один из способов решить эту проблему - снова установить шрифт в layoutSubviews
, поскольку прокси внешнего вида применяются непосредственно перед вызовом layoutSubviews
.Однако мне не нравится этот подход.
Другое возможное решение - установить isTranslucent
вручную для каждого контроллера навигации.Это решение, которое я выбираю, но я все еще чувствую, что есть ошибка с внешним видом прокси.Как минимум, мы должны ожидать согласованного поведения между первоначальным запуском и восстановлением состояния.
Любая помощь очень ценится.