web-dev-qa-db-ja.com

UINavigationBar setBackgroundImage:forBarMetrics:機能していません

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];

残念ながら、これは機能しません。誰かが何か提案があれば、私はすべての耳です!

13
Nick ONeill

すべてのナビゲーションバーに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は何にも接続されていないため、背景画像は変更されません。

44
Rob Bajorek

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];   

}

これにより、横向きと縦向きの両方のモードの画像が設定されます

4
Kamleshwar

ナビゲーションコントローラーからナビゲーションバーを取得する必要があります。現在、作成しているだけで、リリースすると割り当てが解除されます。ビューコントローラのナビゲーションコントローラを入手する必要があります。

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

同じものをツールバーに適用したい場合は、少し異なることに注意してください。これは、Robの答えに基づいた例です。

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

UINavigationBarサブクラスを使用するようなことはしませんでしたか?これを実行してdrawRect:をオーバーライドすると、iOS5以降では問題が発生します。

両方のOSバージョンをサポートする方法については、私の答えを参照してください ここ

0
Paul de Lange

これは私のために働いた。

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;
0
Sunil Adhyaru