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

时间:2011-10-28 13:34:59

标签: iphone ios ios4 uinavigationcontroller uinavigationbar

我想将图像设置为UINavigationController背景,但我找到的大多数解决方案都会在导航栏中为应用中的所有视图应用背景。你能提供一些可能有用的代码吗?

求助,

的Stephane

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

这是我在我的一个项目中使用的快速而肮脏的方式(我不需要支持横向)。我使用方法调配将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中更改图片,请在UINavigationController中恢复这些图片。

这不完美,我会添加一些交叉渐变过渡,为背景添加推/弹,但我还没有时间,所以随时改进它。

答案 2 :(得分:2)

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

如果需要区分各种视图控制器,则需要更改应该表现不同的一个视图控制器的viewWillAppearviewWillDisappear中的栏。你明白了。

答案 3 :(得分:0)

Stephane Kouakou,

试试这个作品......

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

特别是View的willAppear方法

答案 4 :(得分:0)

我相信这是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];
}