自定义导航栏

时间:2012-02-21 19:37:34

标签: ios uinavigationcontroller uinavigationbar

我有一个导航控制器作为我的应用程序的根目录,我使用外观代理来自定义iOS 5上的外观,但是对于iOS 4,我希望使用一个类别来覆盖drawRect:,这很好,除了所有导航栏都受到影响,正如您对类别所期望的那样。

我不想篡改“系统”弹出窗口,例如邮件编辑器或短信作曲家,我希望他们的栏位保持蓝色和系统状。

我尝试使用它的xib创建我自己的UINavigationController,并将NavigationBar的类更改为我的自定义子任务UINavigationBar。但结果并没有在屏幕上产生任何影响。

我知道以下帖子,但无法按预期运行任何解决方案。 How to subclass UINavigationBar for a UINavigationController programmatically?

我的第一次尝试确实有效但使用了未记录的setNavigationBar:方法:

_myNavigationController = [[UINavigationController alloc] initWithRootViewController:someVC];

if([[BT_NavigationController class] respondsToSelector:@selector(appearance)]){

    // some iOS 5 magic in here !
    [_myNavigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"topbar.png"];

}else{

    // Probably looking at app store refusal 
    CustomBar * bar = [[CustomBar alloc] init];
    // [_myNavigationController setNavigationBar: bar];
    [bar release];

}

[parentView presentModalViewController:_myNavigationController animated:YES];

为了避免我创建了一个UINavigationController,我也有一个xib,将导航栏的类重新分配给我的自定义类,但是在drawRect:方法中放置断点,我可以看到它没有被调用。

为什么会这样,似乎我的代码没有加载nib,因此没有意识到nab bar应该是我的自定义类而不是UINavigationBar。

任何提示都会有所帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

如果您的修改只是添加图像,您只需从要自定义的视图控制器中插入它:

UIImageView *bgImageView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"topbar.png"]] autorelease];
[self.navigationController.navigationBar addSubview:bgImageView];

您必须根据UINavigationBar中的其他元素调整一点,以使UIImageView位于子视图的最低索引但仍高于背景。为我们工作。

祝你好运。