2011-10-28 15 views
1

私はUINavigationControllerの背景としてイメージを設定したいと思いますが、私が見つけたソリューションのほとんどは、アプリケーションのすべてのビューのナビゲーションバーに背景を適用します。あなたが助けるかもしれないいくつかのコードを与えることができますか?助けるため一部のビューでUINavigationBarの背景をイメージで変更するにはどうすればいいですか?

Thxを、

ステファン

答えて

3

私は自分のプロジェクトで使っているすばやく汚い方法です(私は横向きの向きをサポートします)。メソッドswizzlingでUINavigationBarのカテゴリで実装しました。 iOS 4と5で動作します(iOS 3では試していません)。

UINavigationBar + SYCustomBackground.h

#import <UIKit/UIKit.h> 

@interface UINavigationBar (SYCustomBackground) 
@property (nonatomic,retain) UIImage *sy_customBackgroundImage; 
@end 

UINavigationBar + SYCustomBackground.m

#import "UINavigationBar+SYCustomBackground.h" 
#import <objc/runtime.h> 

@implementation UINavigationBar (SYCustomBackground) 

static char BACKGROUND_IMAGE_KEY; 
static BOOL drawRectsSwizzled = NO; 

// Swizzles drawRect: and sy_drawRect: 
- (void)swizzleDrawRectIfNecessary 
{ 
    if (!drawRectsSwizzled) { 
     Method origMethod = class_getInstanceMethod([self class], @selector(drawRect:)); 
     Method myMethod = class_getInstanceMethod([self class], @selector(sy_drawRect:)); 
     method_exchangeImplementations(origMethod, myMethod); 
     drawRectsSwizzled = YES; 
    } 
} 

- (void)setSy_customBackgroundImage:(UIImage *)image 
{ 
    // iOS 5 
    if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
     [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
    } 
    // iOS < 5 
    else { 
     [self swizzleDrawRectIfNecessary]; 
     objc_setAssociatedObject(self, &BACKGROUND_IMAGE_KEY, image, OBJC_ASSOCIATION_RETAIN); 
    } 
} 

- (UIImage *)sy_customBackgroundImage 
{ 
    // iOS 5 
    if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
     return [self backgroundImageForBarMetrics:UIBarMetricsDefault]; 
    } 
    // iOS < 5 
    else { 
     [self swizzleDrawRectIfNecessary]; 
     return objc_getAssociatedObject(self, &BACKGROUND_IMAGE_KEY); 
    } 
} 

- (void)sy_drawRect:(CGRect)rect 
{ 
    UIImage *backgroundImage = self.sy_customBackgroundImage; 

    if (backgroundImage) { 
     [backgroundImage drawInRect:rect]; 
    } 
    else { 
     // No custom image, calling original drawRect: 
     // Note: it’s swizzled, so we must call sy_drawRect: 
     [self sy_drawRect:rect]; 
    } 
} 

@end 

次に、あなたはviewWillAppearであなたの背景画像を設定し、変更したい場合はviewWillDisappearにそれらを復元画像は1つでUINavigationControllerです。

これは完璧ではないですが、クロスフェードトランジションを追加し、バックグラウンドのプッシュ/ポップを追加しますが、まだ時間がありませんので、気軽に改善してください。

0

こんにちはステファンKouakou、

これは、作品をそれ `s試す...

UIImageView *bgNavigation= [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"bgNav.png"]];  
    self.navigationItem.titleView = bgNavigation;  
    [bgNavigation release]; 

particularView`s willAppear方法で

+0

'titleView'はバックグラウンドではありません。 –

+0

私はタイトルビューではない背景を意味しました:) – Steve

2

明らかに、画像をナビゲーションバーの背景として設定する方法は既にわかっています。

さまざまな表示コントローラを区別する必要がある場合は、異なる動作を想定している1つの表示コントローラのviewWillAppearviewWillDisappearのバーを変更する必要があります。あなたはその考えを得る。

6

これはナビゲーションコントローラの背景画像を設定する正しい方法です。これは、私は、これはiOS5を、あなたが完了したら、背景画像の「除去」という主な問題のためにこれに対する最初の実際の答えであると信じる

[navBar setBackgroundImage:[UIImage imageNamed: @"image.png"] forBarMetrics:UIBarMetricsDefault]; 
+0

あなたは単一のuiviewの背景だけを変更したい場合、これはうまくいかないかもしれません。それはnavコントローラのすべてのuiviewのために働く。 – giuseppe

+0

これはほとんどの人の問題の解決策かもしれませんが、この機能はバックグラウンドを「設定解除」できません。 –

0

IOS 5で利用可能です。さて、既存のものをそのまま残してください。

@implementation MyViewController { 
    UIImage *_defaultImage; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    _defaultImage = [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault]; 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar.png"] forBarMetrics:UIBarMetricsDefault]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [self.navigationController.navigationBar setBackgroundImage:_defaultImage forBarMetrics:UIBarMetricsDefault]; 
} 
関連する問題