UINavigationBar setBackgroundImage:forBarMetrics:Not Working

时间:2011-10-13 21:47:28

标签: objective-c ios cocoa-touch ios5

我刚刚切换到iOS 5,除了自定义导航栏之外,一切似乎都在我的应用程序中工作。我环顾四周,并按照每个人的建议调用新方法setBackgroundImage:forBarMetrics:但它似乎不起作用。这是我试图将它们放在app委托中以及某些视图控制器的viewDidLoad方法中的代码:

UINavigationBar *nb = [[UINavigationBar alloc]init];
if( [nb respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] )
{
    UIImage *image = [UIImage imageNamed:@"navBarBackground.png"];
    [nb setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}
[nb release];

不幸的是,这不起作用。如果有人有任何建议,我全都听见了!

6 个答案:

答案 0 :(得分:44)

要将image应用于所有导航栏,请使用外观代理:

[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

对于个别酒吧:

// Assuming "self" is a view controller pushed on to a UINavigationController stack
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

在您的示例中,背景图片不会更改,因为nb未连接到任何内容。

答案 1 :(得分:4)

rob的回答是正确的,但如果应用程序在iOS 4.3或更低版本上运行,则会崩溃。所以你可以像

那样实现这个
if([[UINavigationBar class] respondsToSelector:@selector(appearance)]) //iOS >=5.0
{
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar.png"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navBar-Landscape.png"] forBarMetrics:UIBarMetricsLandscapePhone];   

}

这将为模式Landscape和Portrait

设置图像

答案 2 :(得分:3)

您需要从导航控制器获取导航栏。现在你只是创建一个,然后释放它时deallocs。您需要获取视图控制器的导航控制器。

UINavigationController * navigationController = [self navigationController];
UINavigationBar * nb = [navigationController navigationBar];

答案 3 :(得分:3)

请注意,如果要将其应用于工具栏,则会略有不同。这是一个例子,以Rob的答案为基础:

    [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"NavBarDarkWoodGrain.png"] forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];

答案 4 :(得分:0)

你没有像使用UINavigationBar子类那样做什么?如果你这样做并在iOS5及更高版本上覆盖drawRect:那么事情就会破裂。

有关支持两种操作系统版本的方法,请参阅我的回答here

答案 5 :(得分:0)

这对我有用。

UIView *parentViewLeft = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
parentViewLeft.backgroundColor = [UIColor clearColor];

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar.png"]
                                                  forBarMetrics:UIBarMetricsDefault];    
} else {
    UIImageView* imgBG = [[UIImageView alloc]init];
    imgBG.image = [UIImage imageNamed:@"navbar.png"];
    imgBG.frame = CGRectMake(-10,0, 330, 44);
    [parentViewLeft addSubview:imgBG];
}

UIBarButtonItem *customBarButtomLeft = [[UIBarButtonItem alloc] initWithCustomView:parentViewLeft];
self.navigationItem.leftBarButtonItem = customBarButtomLeft;