IOS 5に切り替えたところ、カスタムナビゲーションバーを除いて、すべてがアプリケーションで機能しているように見えます。私は周りを見回して、新しいメソッドsetBackgroundImage:forBarMetrics:を呼び出すというみんなの提案に従いましたが、機能していないようです。これは、アプリデリゲート内と一部のビューコントローラーの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];
残念ながら、これは機能しません。誰かが何か提案があれば、私はすべての耳です!
すべてのナビゲーションバーに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
は何にも接続されていないため、背景画像は変更されません。
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];
}
これにより、横向きと縦向きの両方のモードの画像が設定されます
ナビゲーションコントローラーからナビゲーションバーを取得する必要があります。現在、作成しているだけで、リリースすると割り当てが解除されます。ビューコントローラのナビゲーションコントローラを入手する必要があります。
UINavigationController * navigationController = [self navigationController];
UINavigationBar * nb = [navigationController navigationBar];
同じものをツールバーに適用したい場合は、少し異なることに注意してください。これは、Robの答えに基づいた例です。
[[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"NavBarDarkWoodGrain.png"] forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];
UINavigationBarサブクラスを使用するようなことはしませんでしたか?これを実行してdrawRect:をオーバーライドすると、iOS5以降では問題が発生します。
両方のOSバージョンをサポートする方法については、私の答えを参照してください ここ 。
これは私のために働いた。
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;