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

时间:2011-06-17 11:55:23

标签: iphone ios uinavigationbar categories

我在Custom background for UINavigationBar problems张贴的答案后,成功实施了自定义背景的导航栏。

但是,我想为我的一些控制器设置标准导航栏,我不知道如何实现这一目标。

如果我基于基于导航的应用程序模板启动一个新项目,并且只是在单独的.h和.m文件中添加UINavigationBar类别,则会立即应用此类别。不包括或任何必要的。这是如何工作的?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是一个快速入侵 - 使用导航栏的tag属性打开自定义代码,即

@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的导航控制器使用您的自定义背景。如果您将代码设置为&gt; 500,您将获得默认行为。


修改

正如@MikeWeller正确指出的那样,我们无法访问drawRect的初始实现,我们的类别已经覆盖了它。

看一下this link的解决方案 - 基本上,这是一个可以包含的宏,它为您提供了额外的方法:

@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

NB我自己没有尝试过,但之前使用过本博客的其他文章取得了巨大的成功,所以我相信它:)让我们知道你是如何继续下去的!

答案 1 :(得分:0)

@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中不起作用,因为apple已经改变了UINavigationBar的实现,所以改为创建UINavigationBar的子类并覆盖那里的方法,而不是创建类别。