我刚刚切换到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];
不幸的是,这不起作用。如果有人有任何建议,我全都听见了!
答案 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;