10

ナビゲーション ビューの背景画像を正しく表示する際に問題が発生しています。これが写真です:

代替テキスト

コードは次のとおりです。

- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {

        UIImage *image = [UIImage imageNamed: @"bg_table_active.png"];
        UIImageView *imageview = [[UIImageView alloc] initWithImage: image];
        UIBarButtonItem *addButton = [[UIBarButtonItem alloc]
                                       initWithTitle:NSLocalizedString(@"Settings", @"")
                                       style:UIBarButtonItemStyleDone
                                       target:self
                                       action:@selector(GoToSettings)];
        self.navigationItem.titleView = imageview;
        self.navigationItem.rightBarButtonItem = addButton;
        self.navigationItem.hidesBackButton = TRUE;
    }
    return self;
}

画像をナビゲーション ビュー全体に拡大するにはどうすればよいですか?

4

8 に答える 8

24

私は自分のアプリでこれを正確に行います。AppDelegate 内には、次のコードがあります。

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect
{
  UIImage *image = [UIImage imageNamed: @"custom_nav_bar.png"];
  [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
于 2009-08-11T22:01:17.457 に答える
9

必要に応じてカスタム イメージを設定できるように、Mike Rundle のバージョンを変更しました。また、提案された変更を 40lb-suit-of-bees にマージしました。初期化中に initImageDictionary を呼び出す必要があります。

//UINavigationBar+CustomImage.h
#import <Foundation/Foundation.h>

@interface UINavigationBar(CustomImage)
+ (void) initImageDictionary;
- (void) drawRect:(CGRect)rect;
- (void) setImage:(UIImage*)image;
@end


//UINavigationBar+CustomImage.m    
#import "UINavigationBar+CustomImage.h"
//Global dictionary for recording background image
static NSMutableDictionary *navigationBarImages = NULL;

@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image

+ (void)initImageDictionary
{
    if(navigationBarImages==NULL){
        navigationBarImages=[[NSMutableDictionary alloc] init];
    }   
}

- (void)drawRect:(CGRect)rect
{
    NSString *imageName=[navigationBarImages objectForKey:[NSValue valueWithNonretainedObject: self]];
    if (imageName==nil) {
        imageName=@"header_bg.png";
    }
    UIImage *image = [UIImage imageNamed: imageName];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
    [navigationBarImages setObject:image forKey:[NSValue valueWithNonretainedObject: self]];
}
@end
于 2010-01-12T02:51:53.047 に答える
1

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

それが役に立てば幸い..

于 2010-04-22T06:55:25.750 に答える
1

これも使えます

if([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
        //iOS 5 new UINavigationBar custom background
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbg_ForiPhone5_Imagename.png"] forBarMetrics: UIBarMetricsDefault];
    } else {
        [self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navbg_ForOtherIphone_Imagename.png"]] atIndex:0];
    }

`

于 2012-12-12T05:59:42.527 に答える
1

Mike Rundle と Casebash のコードは素晴らしいです。[NSValue valueWithNonretainedObject:self] を使用して、copyWithZone エラーを回避しました。NSValue オブジェクトで self をラップすると、それを navigationBarImages ディクショナリにコピーできます。


- (void)drawRect:(CGRect)rect
{
    NSString *imageName=[navigationBarImages objectForKey:[NSValue valueWithNonretainedObject:self]];
...}


- (void)setImage:(NSString*)image
{
    [navigationBarImages setObject:image forKey:[NSValue valueWithNonretainedObject:self]];
}

于 2010-02-26T23:05:15.820 に答える
0
 UIImage *image = [UIImage imageNamed: @"navigator.png"];

[_homeNavigationController.navigationBar setBackgroundImage:Image forBarMetrics:UIBarMetricsDefault];

于 2013-06-04T08:16:30.780 に答える
-2

残念ながら、iPhoneOS3.0またはそれ以前のバージョンのナビゲーションバーでカスタム背景画像を使用することはサポートされていません。外観をカスタマイズする唯一の方法は、スタイルと色合いの色を設定することです。完璧ではありません、私は知っています。

コードでは、ナビゲーションバーのタイトルビューを拡大して、右ボタンを「下に移動」しようとしています。ただし、ナビゲーションバーの3つのビュー(戻るボタン、タイトル、および右ボタン)は同じレイヤーにあると想定され、重ならないように調整されているため、これは不可能です。これは機能です。

背景画像を変更するサードパーティのアプリがいくつかあることは知っていますが、それらはシステムを「ハッキング」しており、サポートされていないプライベートAPIまたはナビゲーションバーの内部データ構造の仮定を使用しています。これらのプログラムは、iPhone OSの将来のバージョンで失敗する(クラッシュするか、正しく表示されない)可能性があります。

あなたはおそらくこれを台無しにしたくないでしょう。ナビゲーションバーにカスタムの背景画像を(まだ)含めることができないという事実を受け入れます。痛いです、私は知っています。ただし、システムをハッキングし、OSの将来のバージョンでアプリが失敗した場合、Appleはアプリをアプリストアからプルし、アプリを変更するまですべての収益を失います。あなたに電話ですよ...

于 2009-07-03T12:47:25.460 に答える