根据在自定义后台发布的UINavigationBar问题的答案,我成功地实现了一个具有自定义背景的导航栏。
然而,我想为我的一些控制器提供标准的导航栏,我不知道如何实现这一点。
如果我基于基于导航的应用程序模板启动一个新项目,并在单独的.h和.m文件中添加UINavigationBar类别,则会立即应用该类别。没有包含或任何必要的内容。这是怎么回事?
谢谢你的帮助!
这里有一个快速破解-使用导航栏的标签属性打开自定义代码,即
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
if (tag < 500) {
// Drawing code
UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
} else {
// Do the default drawing
}
}
@end
现在,标签小于500的导航控制器使用您的自定义背景。如果将标记设置为>500,则获得默认行为。
编辑
正如@MikeWeller正确指出的那样,我们无法访问drawRect的初始实现,我们的类别已经覆盖了它。
看看这个链接可以找到一个解决方案——基本上,这是一个可以包含的宏,它为您提供了一个额外的方法:
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
if (tag < 500) {
// Drawing code
UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
} else {
// Do the default drawing
invokeSupersequent(rect);
}
}
@end
注意:我自己没有尝试过,但以前使用过这个博客的其他文章,取得了巨大的成功,所以我相信它:)让我们知道你的进展!
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
if (tag < 500) {
// Drawing code
UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
} else {
// Do the default drawing
}
}
@end
记住这个方法在iOS 5.0中不起作用,因为苹果已经更改了UINavigationBar的实现,所以改为创建UINavigationBar的子类并覆盖那里的方法,而不是创建类别。