Iphone UINavigationController(drawRect:)

Iphone UINavigationController(drawRect:),iphone,objective-c,uinavigationcontroller,uinavigationbar,Iphone,Objective C,Uinavigationcontroller,Uinavigationbar,我创建了一个带有TabBarController、4个TabBarItem的应用程序,每个TabBarItem都有自己的NavigationController文件(在IB中创建的所有内容) 我正在使用drawRect函数设计我的导航栏: @implementation UINavigationBar (customImage) -(void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed:@"MyImage.

我创建了一个带有TabBarController、4个TabBarItem的应用程序,每个TabBarItem都有自己的NavigationController文件(在IB中创建的所有内容)

我正在使用drawRect函数设计我的导航栏:



@implementation UINavigationBar (customImage)

-(void)drawRect:(CGRect)rect {

  UIImage *image = [UIImage imageNamed:@"MyImage.png"];
  [image drawInRect:CGRectMake(0,0, self.frame.size.width,self.frame.size.height)];

}

@end

问题是,我的应用程序中的每个ViewController的导航栏都会更改,我只想为一个选项卡项绘制导航栏,并为其他控制器使用默认导航栏。
怎么做


谢谢,

在这种情况下使用类别可能不是最好的主意(如果您使用类别覆盖
drawRect:
,所有
UINavigationController
都将受到影响)。最好将UINavigationController子类化,并且只在需要的选项卡中使用自定义子类

编辑:将UINavigationController子类化相当容易:

(在.h文件中)

(在.m文件中)

然后,在适当的情况下,在代码中使用
MyCustomNavigationController
而不是
UINavigationController
。类别(您在示例中使用的类别)有助于向现有类添加方便的方法,但在替换现有方法时可能很危险(因为您的自定义方法将替换所有用途的原始方法)。

确定

他花了我很长时间,但我找到了解决办法。通过使用swizzling方法,我可以做任何我想做的事情。
有关如何实现它的更多信息,请参阅此部分。

好的,但是如何将NavigationController子类化并在其中绘制navigationBar?我认为那是最好的主意,但我不知道怎么做。你有一些代码吗?我已经这么做了,因为就像我说的,我使用IB,并且我有像这样的每个navigationController的子类。但是似乎没有调用drawRect。哦,对不起,我没有看到您将类别添加到UINavigationBar,而不是UINavigationController(
drawRect:
不会为UINavigationController调用)。不幸的是,UINavigationBar和UINavigationController在这方面不是很灵活(您无法设置导航控制器的导航栏)。您最好使用自定义UIToolbar(我在上找到了一个快速教程)。否则,您可以尝试将图像添加为导航栏的一个项目。谢谢您的帮助,但我认为我不能使用UIToolBar,我需要在每个ViewController中使用自定义UInavigationBar。必须有一种方法来为它们中的每一个绘制导航栏,我必须发现你不能将uinavigationbara子类化任何机会你都可以发布你用于为特定控制器swizzle drawRect方法的实际代码?我因为使用swizzling方法而被拒绝,这不再是有效的解决方案
@interface MyCustomNavigationController : UINavigationController {
}
@end
@implementation MyCustomNavigationController

-(void)drawRect:(CGRect)rect {
    //custom drawing here
}
@end