如何在一些视图上更改UINavigationBar背景图像,但不是全部?

我想设置一个图像作为UINavigationController背景,但我发现大多数解决scheme应用导航栏中的所有视图背景。 你能给一些可能有帮助的代码吗?

Thx帮助,

斯特凡

这是我在其中一个项目中使用的一种快速和肮脏的方式(我不需要支持横向方向)。 我用一个类别UINavigationBar实现它与方法swizzling。 适用于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设置背景图像,如果要在一个UINavigationController更改图像,请在viewWillDisappear中将其恢复。

这不是完美的,我会添加一些淡入淡出的过渡,为背景添加推/stream行,但我没有时间,所以随时提高。

这是为导航控制器设置背景图像的正确方法。 这是在iOS 5中可用。

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

显然,您已经知道如何将图像设置为导航栏的背景。

如果你需要区分不同的视图控制器,你需要改变一个视图控制器的viewWillAppearviewWillDisappear中应该有不同的行为。 你明白了。

嗨Stephane Kouakou,

试试这个工程…

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

特别是View`s会出现一个方法

我相信这是iOS5的第一个真正的答案,一旦你完成,主要问题是“删除”背景图像。 那么,只保留现有的。

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