如何以编程方式为UINavigationController创建UINavigationBar的子类?

rom*_*ego 23 iphone cocoa-touch uinavigationbar uinavigationcontroller ios

我正在使用自定义drawRect函数UINavigationBar在iOS4中跨我的应用程序进行绘制,它不使用图像,只使用CoreGraphics.

由于您无法UINavigationBar在iOS5中实现类别中的drawRect ,因此Apple建议使用子类UINavigationBar.

当属性是只读时,如何替换UINavigationBarmy子类UINavigationController(因此它将与iOS4和iOS5兼容)navigationBar

@property(nonatomic, readonly) UINavigationBar *navigationBar
Run Code Online (Sandbox Code Playgroud)

我根本不在我的应用程序中使用XIB,因此添加UINavigationBar到NIB并通过InterfaceBuilder更改类不是一种选择.

Jav*_*oto 81

在iOS 6中,他们添加了一种新的方法UINavigationController,在iOS 5中也可以回缩:

- (id)initWithNavigationBarClass:(Class)navigationBarClass
                    toolbarClass:(Class)toolbarClass;
Run Code Online (Sandbox Code Playgroud)

现在,您可以在实例化导航控制器时传递自定义类.


mem*_*ons 42

从iOS6开始,现在可以通过使用UINavigationControllers方法轻松完成其他类的操作initWithNavigationBarClass:toolbarClass:

- (id)initWithNavigationBarClass:(Class)navigationBarClass 
                    toolbarClass:(Class)toolbarClass;
Run Code Online (Sandbox Code Playgroud)

来自文档:

初始化并返回使用自定义栏子类的新创建的导航控制器.

为iOS6更新了答案.

  • PS.你也可以调配UINavigationController的initWithRootViewController,并在那里添加解决方案2,让生活更轻松. (2认同)

Ros*_*mes 5

在iOS 4中唯一支持的方法是使用Interface Builder方法.除了设置UINavigationBar子类之外,您不必使用IB来执行任何操作(您仍然可以以编程方式设置所有视图).