Обновить внешний вид UINavigationBar?
В моем приложении iPad у меня есть представление настроек приложения. Один из параметров позволяет пользователю переключаться с цветовой схемой интерфейса. Представление настроек загружается segue в отдельный контроллер просмотра, чем мое "основное" окно приложения.
Когда они выбирают новый цвет, я переключаю переменную colorSchemeColor и делаю это:
// set the colors and refresh the view
[[UINavigationBar appearance] setBarTintColor:colorSchemeColor];
[[UIToolbar appearance] setBarTintColor:colorSchemeColor];
[[UITabBar appearance] setBarTintColor:colorSchemeColor];
Однако ни один из баров не меняет цвет, пока не выйду из окна настроек! (Когда окно настроек исчезает, цвета для основного приложения меняются правильно!)
Итак, я попытался поместить этот код сразу после обновления представления настроек:
[self.view setNeedsDisplay];
[self.view setNeedsLayout];
что не помогло. Поэтому я добавил также:
[self.navigationController.view setNeedsDisplay];
[self.navigationController.view setNeedsLayout];
Это тоже не сработало.
Как я могу получить представление настроек для "перерисовать" себя при выборе нового цвета, чтобы изменение стало очевидным?
Большое спасибо!
Ответы
Ответ 1
Прокси-сервер внешнего вида влияет только на внешний вид новых инициализированных представлений. Установка цветов в прокси-сервере внешнего вида не влияет на видимые полосы навигации.
Вам нужно будет вручную обновить текущий вид; например:
self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor;
Ответ 2
В то время как я думаю, что Aaron Brager отвечает, это идеальная оценка, моему приложению требуется около 15 различных параметров внешнего вида и использует контроллер разделенного вида, поэтому мне нужно повторно применить все настройки к глобальному виду, а затем применить их все к моим двум отображаемым Просмотры. Это много избыточного кода.
Основываясь на идее, что представление и отклонение контроллера модального представления вынуждает все под ним перерисовывать, я пробовал это, и он отлично работал:
UIViewController *redrawTrigger = [[UIViewController alloc] init];
redrawTrigger.modalPresentationStyle = UIModalPresentationFullScreen;
[mySplitViewController presentModalViewController:redrawTrigger animated:FALSE];
[mySplitViewController dismissModalViewControllerAnimated:FALSE];
[redrawTrigger release];
Ответ 3
Objective-C:
self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;
Swift:
self.navigationController?.isNavigationBarHidden = true
self.navigationController?.isNavigationBarHidden = false