我在Custom background for UINavigationBar problems张贴的答案后,成功实施了自定义背景的导航栏。
但是,我想为我的一些控制器设置标准导航栏,我不知道如何实现这一目标。
如果我基于基于导航的应用程序模板启动一个新项目,并且只是在单独的.h和.m文件中添加UINavigationBar类别,则会立即应用此类别。不包括或任何必要的。这是如何工作的?
感谢您的帮助!
答案 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的子类并覆盖那里的方法,而不是创建类别。