UINavigationBar背景图像问题

时间:2010-05-10 17:22:03

标签: objective-c cocoa-touch uinavigationcontroller background

我已在我的App委托中使用此代码设置导航栏背景:

@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
    UIImage *backgroundImage = [UIImage imageNamed: @"Nav-rightpane.png"];

    CGContextDrawImage(UIGraphicsGetCurrentContext(),
                       CGRectMake(0, 0, self.frame.size.width, self.frame.size.height),
                       backgroundImage.CGImage);
}
@end

这很完美,但现在我必须将背景更改为UIPopoverController的默认值。对此有何想法?

由于

2 个答案:

答案 0 :(得分:0)

请勿使用此解决方案。只需删除您的UINavigationBar类别并实施您自己的UINavigationController

@interface XNavigationController : UINavigationController{}

并在实现中更改覆盖viewDidLoad方法

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *img = [UIImage imageNamed: @"Nav-rightpane.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:img];
    [imageView setFrame:self.navigationBar.bounds];
    [imageView setContentMode:UIViewContentModeScaleToFill];
    [self.navigationBar addSubview:imageView];
    [imageView release];
}

因此,当您想要更改导航栏的背景时,请使用此navigationController

答案 1 :(得分:0)

Apple5工程师推荐的iOS5之前的正确解决方案是使用类别,使用方法调配。这已被证实可以在iOS 5上突破,这非常接近于发布。

相反,您应该创建UINavigationBar的子类,覆盖drawRect:方法,然后使用Interface Builder来定义导航控制器。 Interface Builder允许您将导航栏的类名更改为自定义子类:

enter image description here

enter image description here

如果要避免使用Interface Builder,可以创建临时XIB并从中加载导航控制器的实例,然后使用NSKeyedArchiver将其存档到文件中。然后在命令行上使用xxd -i <filename>为导航控制器的原始字节生成C代码。然后将其粘贴到源文件中,并在需要实例时将其取消归档。

看起来很多工作,但论坛上的WWDC视频和工程师一再表示,这是做你想做的唯一安全可靠的方式。

在iOS 5中,这一切都变得容易多了。