【问题标题】:How do I change the background of a UINavigationBar?如何更改 UINavigationBar 的背景?
【发布时间】:2011-05-18 04:11:19
【问题描述】:

我想将 UINavigationBar 的背景更改为 [UIColor colorWithImage:],但它不起作用。我错过了什么?

编辑:

创建子类后,在哪里设置 UINavigationController 以使用它?

【问题讨论】:

    标签: iphone ios uinavigationbar tabbar


    【解决方案1】:

    您可以使用tintColor 属性来更改UINavigationBar颜色,但是要将图像设置为背景,您必须提供自己的UINavigationBar 子类并覆盖drawRect: 方法,例如:

    - (void)drawRect:(CGRect)rect {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"background-image.png"];
        [img drawInRect:CGRectMake(0, 
                                   0, 
                                   self.frame.size.width, 
                                   self.frame.size.height)];
    }
    

    如果您使用 Interface Builder 构建您的 UI,然后使用自定义导航栏,只需在 Interface Builder 中选择 UINavigationBar 元素,打开 Inspector 并在 Identity 选项卡中的类字段中指定您的 UINavigationBar 子类,如下所示:

    【讨论】:

    • 现在如何设置 UINavigationBar 以显示在 UINavigationController 内部?
    • 好问题 - 相应修改答案。
    • 这可能纯粹在代码中吗?另外,这会破坏 HIG 吗?
    • 我不相信它会破坏 HIG。我在 App Store 上有使用此功能的应用。
    • 看起来好像无法在代码中设置它,除非您使用 UINavigationController 未记录的 setNavigationBar: 方法,该方法有效,但可能会导致您的应用被 App Store 拒绝。您可以使用 Denis Hennessy 的类别解决方案(此处的其他答案之一)纯粹在代码中实现此目的。 This SO question 有其他建议。
    【解决方案2】:

    要在导航栏中显示图像,您必须自己绘制它,这实际上并不难。将其另存为UINavigationBar+CustomBackground.m(它向 UINavigationBar 添加了一个自定义类别):

    @implementation UINavigationBar (CustomBackground)
    
    - (void)drawRect:(CGRect)rect {
        UIImage *image = [UIImage imageNamed:@"NavMain.png"];
        [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }
    
    @end
    

    【讨论】:

    • 使用类别将不可撤销地更改所有导航栏的背景。最好使用子类。
    • 我们一直使用这种方法,直到我们想要在不同的视图控制器上使用不同的导航栏。那么这个方法不幸失败了
    • 实际上,伙计们,您也许可以进行一些类检测,并根据类做出不同的行为。不过,您仍然需要重新实现默认行为。
    猜你喜欢
    • 2011-12-07
    • 2015-05-25
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多