【问题标题】:Custom NavigationBar自定义导航栏
【发布时间】:2012-03-12 03:24:35
【问题描述】:

我有一个导航控制器作为我的应用程序的根,我正在使用外观代理来自定义 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。

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

【问题讨论】:

    标签: ios uinavigationcontroller uinavigationbar


    【解决方案1】:

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

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

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

    祝你好运。

    【讨论】:

    • 似乎当我为我的导航控制器设置这个时,后续详细视图的条形标题和条形按钮被放置在图像后面。
    • 是的。您必须在导航栏上使用 sendSubviewToBack: (或 insertSubview:atIndex:)。这取决于您的导航栏的子视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多