UINavigationBar上的类别-仅适用于某些控制器



根据在自定义后台发布的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的子类并覆盖那里的方法,而不是创建类别。