4

我正在为我设置自定义图像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

4

2 回答 2

4

我已经下载了您的示例项目并设法修复它。我会解释问题是什么。

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

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

代码:在-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];
}

在半透明视图控制器中

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

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

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

于 2012-09-18T10:35:00.420 回答
0

根据您是否也使用选项卡栏,您可以将您的 appDelegate 指定为导航栏的委托或 UINavigationController 的子类,这样您的代码就会知道对 viewController 堆栈的所有更改。然后,根据可见 viewController 的类设置 UINavigationBar 上的属性以使其透明或不透明。

于 2012-08-27T13:53:05.887 回答