我已在我的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的默认值。对此有何想法?
由于
答案 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允许您将导航栏的类名更改为自定义子类:
如果要避免使用Interface Builder,可以创建临时XIB并从中加载导航控制器的实例,然后使用NSKeyedArchiver
将其存档到文件中。然后在命令行上使用xxd -i <filename>
为导航控制器的原始字节生成C代码。然后将其粘贴到源文件中,并在需要实例时将其取消归档。
看起来很多工作,但论坛上的WWDC视频和工程师一再表示,这是做你想做的唯一安全可靠的方式。
在iOS 5中,这一切都变得容易多了。