UINavigationBar + UIToolBar UIAppearance以及应用程序某些部分的半透明barStyle?

时间:2012-08-27 13:18:59

标签: ios uinavigationcontroller uinavigationbar uitoolbar uiappearance

我使用以下代码为UINavigationBarUIToolbar设置自定义图片:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar"] forBarMetrics:UIBarMetricsDefault];
[[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"toolbar"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

我正在使用PhotoViewer并将其视图控制器推入视图中。它应该有一个半透明的导航栏和工具栏,但它使用我提供的半透明图形。

问题是,稍后当我推入另一个视图控制器(从PhotoViewer弹回超级)后,它的工具栏也是半透明的,这意味着内容就在它后面。

我没有运气试过以下内容:

[[UINavigationBar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBarStyle:UIBarStyleBlackTranslucent];
[[UINavigationBar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
[[UIToolbar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBarStyle:UIBarStyleBlackTranslucent];
[[UIToolbar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBackgroundImage:nil forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

我有什么想法可以为PhotoViewer实现黑色半透明barStyle ,并使用我的自定义图形保留其他所有内容?

更新:为了获得一些帮助,我将一个示例项目与导航栏的自定义图形组合在一起,然后尝试显示带有半透明导航栏的推送视图控制器使用外观代理时没有成功:EXAMPLE PROJECT

2 个答案:

答案 0 :(得分:4)

我已下载您的示例项目并设法修复它。我会解释问题所在。

首先,UINavigationBar包含在UINavigationController中。因此,RootViewController和TranslucentViewController使用相同的UINavigationBar实例。也许这会引起混乱。此外,这可能是为什么+ appearanceWhenContainedIn:没有按预期工作。

要在整个应用程序中设置导航栏的背景图像,您应该使用+外观。要在导航控制器中设置单个导航栏的背景图像,请使用UINavigationBar的-setBackgroundImagE:forBarMetrics:

代码:in -TranslucentViewController viewWillAppear:设置背景图片和条形样式。在RootViewController中,再次设置背景图像和条形样式。根据我的经验,最好在-viewWillAppear中更改导航栏:而不是-in viewWillDisappear :(或者您需要跟踪将其更改回来的内容。)

在RootViewController中

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController.navigationBar setBarStyle:UIBarStyleDefault];
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"orangeNavigationBar.png"] forBarMetrics:UIBarMetricsDefault];
}

在TranslucentViewController中

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setBarStyle:UIBarStyleBlackTranslucent];
}

哦,并且:只在这些地方改变它。不是在推动视图控制器或任何东西时。

答案 1 :(得分:0)

根据您是否也使用标签栏,您可以将appDelegate指定为导航栏或子类UINavigationController的委托,以便您的代码了解viewController堆栈的所有更改。然后,在UINavigationBar上设置属性,使其透明或不透明,具体取决于可见viewController的类。