代码之家  ›  专栏  ›  技术社区  ›  JOM agenthunt

透明uinavigationbar下的自定义背景

  •  1
  • JOM agenthunt  · 技术社区  · 16 年前

    有一个 “黑色半透明”uinavigationbar下的自定义uiImageView 但是我对结果不太满意。自定义图像不够可见,当更改导航栏alpha值时,它会使其更可见,从而使导航栏标题和按钮更不可见。

    问题: 我想要一个完全可见的自定义uinavigationbar背景图像,带有完全可见的条标题和按钮。我怎么能得到这些?

    更新: 我的答案和这些答案类似,但有点不同。不想接受我自己的回答,所以写了博客( link )在伊勒松,我学习。

    5 回复  |  直到 14 年前
        1
  •  1
  •   Ahmet Ardal    15 年前

    还可以创建uinavigationbar类别类并重写 Drawlayer:InContext: 方法。里面 Drawlayer:InContext: 方法,可以绘制要使用的背景图像。

    - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
    {
        if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
            return;
        }
    
        UIImage *image = (self.frame.size.width > 320) ?
                            [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
        CGContextClip(context);
        CGContextTranslateCTM(context, 0, image.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
    }
    

    有关自定义uinavigationbar外观的完整演示xcode项目 this this 可能会有所帮助。

        2
  •  3
  •   Community Mohan Dere    9 年前

    我也想要一个自定义的uinavigationbar背景图像,最后通过以下方式解决:

    • 在uinavigationcontroller的初始化过程中,我创建了一个calayer contents 设置为背景图像,并相应设置帧。
    • 我将该层添加到uinavigationbar的层(在索引0处,在背景中): [self.navigationBar.layer insertSublayer:imageLayer atIndex:0]

    在这一点上,一开始看起来还可以,但是如果你做任何导航,标签和按钮就会消失在“背景”层后面。所以,

    • 我创建了一个calayer的子类,它改变了insertSublayer的行为:atindex:这样背景层下就不会插入任何层。

    这样地:

     @implementation CTNavigationBarLayer 
     - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx {
         if ( idx == 0 ) idx = 1;
         [super insertSublayer:layer atIndex:idx];
     }
     - (void)addBackgroundLayer:(CALayer*)layer {
         [super insertSublayer:layer atIndex:0];
     }
     @end
    
    • 使用uinavigationbar上的类别,我重载了 +layerClass 返回方法 [CTNavigationBar class] ,因此导航栏使用自定义层。

    当然,这改变了 全部的 应用程序中的uinavigationbars,所以如果这不是你想要的,你会想寻找另一种方法。您可以对uinavigationbar进行子类划分,但是获得uinavigationController中要使用的子类的唯一方法是通过ib(或执行一些相当有趣的操作 mucking about 以编程方式完成)

    • 最后,在uinavigationController初始化过程中,我用对 addBackgroundLayer: 我写的方法。
        3
  •  2
  •   Andrea    14 年前

    在uinavigationbar的类别中使用drawrect在IO5中不起作用。 苹果建议的方法是创建uinavigationbar的子类,并在NIB文件中使用它。

        4
  •  2
  •   algal    14 年前

    为了让稍后来到这里的人们受益,值得注意的是ios5为这种定制提供了直接支持。要更改uinavigationbar下的图像,请使用

    - (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
    

    还有一处房产

    @property(nonatomic, copy) NSDictionary *titleTextAttributes
    

    调整标题。您可以使用外观代理使这些更改在您的应用程序中普遍存在。WWDC 2011,第114部分,“自定义uikit控件的外观”中有更多讨论。

    在ios5之前,您应该通过将uinavigationbar子类化来实现它。

        5
  •  0
  •   loretoparisi    15 年前

    如果您有多个uinavigationController(如在uitabar中),并且每个uinavigationbar需要不同的背景,则ardalahmet解决方案不是正确的解决方案,因为它使用uinavigationbar类别。

    推荐文章