我目前正在使用UIAppearance代理自定义iOS应用的导航栏背景图片。有一个用于在两种不同模式之间切换的按钮,用于触发通知。此通知将再次使用代理将背景更改为其他图像。我的问题是,只有当我去另一个控制器并且我回到它时,这个变化才变得可见。我无法强制更新控制器中的导航栏。
我在MainTabBarController中试过这个:
- (void) onAppChangedMode: (NSNotification*)notif {
APP_MODE mode = (APP_MODE) [[notif object] integerValue];
// change navigation bar appearance
[[UILabel appearance] setHighlightedTextColor:[UIColor redColor]];
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:(mode == 0 ? @"navbar.png" : @"navbar2.png")] forBarMetrics:UIBarMetricsDefault];
// trying to update
for (UIViewController* vc in self.viewControllers) {
[vc.navigationController.navigationBar setNeedsDisplay];
}
}
但没有......它不起作用。知道如何实现吗?
谢谢!
答案 0 :(得分:11)
只需从Windows中删除视图并再次添加:
for (UIWindow *window in [UIApplication sharedApplication].windows) {
for (UIView *view in window.subviews) {
[view removeFromSuperview];
[window addSubview:view];
}
}
答案 1 :(得分:7)
我遇到同样的问题,这段代码可以帮到你:
- (IBAction)btnTouched:(id)sender {
[[UADSwitch appearance]setOnTintColor:[UIColor redColor]];
// Present a temp UIViewController
UIViewController *vc = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];//"self" is an instance of UIViewController
[vc dismissViewControllerAnimated:NO completion:nil];
}
答案 2 :(得分:0)
尝试使用此代码更改当前导航栏的背景图像:
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
更改UIAppearance后使用上面的代码。这将强制更改当前控制器的导航栏。其他控制器的导航栏将由UIAppearance中的更改处理。