第一个viewcontroller (A) 包含一个带有backgroundcolor的普通uinavigationcontroller,然后它会推送一个新的viewcontroller (B) 使用透明的navcontroller。我的第一次尝试是修改 B 中的导航控制器外观,然后当B弹出回到A时反转uinavcontroller的原始颜色。但是当看到导航控制器外观时它似乎搞砸了。我在两个视图之间转换推送和弹出。所以我提出的想法是更换旧的并添加一个完整的全新navcontroller。但是由于某些原因,新的navcontroller从不显示下面的代码?
// Hide the old navigation controller
[self.navigationController setNavigationBarHidden:YES];
// Add a new one
UINavigationController *nav = [[UINavigationController alloc] initWithNavigationBarClass: [TransparentNavBarView class] toolbarClass: [UIToolbar class]];
[nav.navigationItem setLeftBarButtonItems: [self buttonBarItems]];
[nav willMoveToParentViewController: self];
[self.view addSubview: nav.view];
[self addChildViewController: nav];
[nav didMoveToParentViewController:self];
有关我的问题的任何想法?感谢
答案 0 :(得分:0)
我认为您需要了解导航控制器如何在其下工作 请参阅:UINavigationController
UINavigationController
控制ViewControllers的外观。当我们推送一个viewcontroller时,我们实际上将它的视图推送到Navigation Controller的容器视图上。
每个视图控制器的导航栏保持不变。
您可以通过navigationBar
访问由导航控制器管理的每个视图控制器中的self.navigationController.navigationBar
属性。
来自Apple Docs:
允许修改barStyle或半透明属性 导航栏但您必须永远不要更改其框架,边界或 alpha值直接。要显示或隐藏导航栏,您应该 总是通过改变它的导航控制器这样做 navigationBarHidden属性或调用 setNavigationBarHidden:animated:method。
答案 1 :(得分:0)
将此代码用于更改UINavigationBar.backgroundColor
。并在viewWillAppear
中调用此方法,您希望在其中更改NavigationBar
的颜色。
添加此方法:
[[UINavigationBar appearance] setBackgroundImage:[self barBackgroundImage] forBarMetrics:UIBarMetricsDefault];
此视图控制器中的此方法
-(UIImage*)barBackgroundImage{
static UIImage *defaultImage = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
UIGraphicsBeginImageContextWithOptions(CGSizeMake(20, 44), NO, 0.0f);
[[UIColor grayColor] setFill];
[[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 44)] fill];
defaultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
return defaultImage;
}