2010-12-13 97 views
0

我想把导航栏的背景图像。我尝试了下面的代码,但它隐藏了导航的标题。如何把导航栏的背景图像?

self.title = @"My title"; 
UINavigationBar *navBar = self.navigationController.navigationBar; 
UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top.png"]]; 
[navBar addSubview:image]; 
[navBar sendSubviewToBack:image]; 

任何哥们知道这是为什么?

+2

可能重复http://stackoverflow.com/questions/4319112/how-do-i-change-background-of-uinavigationbar) – 2010-12-13 09:13:43

+0

@middaparka它可能是一个可能的重复但不完全。请检查我的答案并考虑它。 – 2010-12-13 10:24:12

回答

3
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"background.png"] forBarMetrics:UIBarMetricsDefault]; 
的[我如何改变一个UINavigationBar的背景?](
0

您可以通过覆盖进行drawRect方法

@implementation UINavigationBar (TENavigationBar) 

- (void) drawRect:(CGRect)rect 
{ 
    UIImage *image = [UIImage imageNamed:@"navigation_background"]; 

    [image drawInRect:CGRectMake(0, 
           0, 
           self.frame.size.width, 
           self.frame.size.height)]; 
} 

@end 
0

解决方案通过WaiLam工作,但如果你是在玩电影在你的应用程序播放器的导航栏也将得到改变。这是一个更好的方法 -

@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    if([self isMemberOfClass:[UINavigationBar class]]) 
    { 
     UIImage *image; 
     image=[UIImage imageNamed:@"hor_bar"]; 
     CGContextClip(ctx); 
     CGContextTranslateCTM(ctx, 0, image.size.height); 
     CGContextScaleCTM(ctx, 1.0, -1.0); 
     CGContextDrawImage(ctx, 
          CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); 
    } 
    else 
    {   
     [super drawLayer:layer inContext:ctx];  
    } 
} 
@end 
0

这将添加一个图像,以正确的大小,NavigationBar居中。

/* custom navbar logo, centered with same height as navbar */ 
UIImageView *logo = [[UIImageView alloc] initWithFrame: 
     CGRectMake(self.navigationController.navigationBar.frame.size.width/2-75,0,150, 
        self.navigationController.navigationBar.frame.size.height-1)]; 
[logo setImage:[UIImage imageNamed:@"text_logo.png"]]; 
[self.navigationController.navigationBar addSubview:logo]; 
[self.navigationController.navigationBar sendSubviewToBack:logo]; 
0

如果您要添加的图像,使其始终贯穿不是使用这个应用程序是相同的:如果你想在一个特定的屏幕只比其设定的图像

- (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)]; 
} 

否则就像是有点棘手:

- (void) viewWillAppear{ 
    ... 
    ... 
    [self addNavigationBarImage:YES]; 
} 

- (void) viewWillDisappear{ 
    ... 
    ... 
    [self addTheNavigationBarImage:NO]; 
} 

- (void) addTheNavigationBarImage:(BOOL)add{ 
    UIImageView *imgView = (UIImageView *)[[self.navigationController navigationBar] viewWithTag:TAG]; 
    if(add){ 
    if(imgView == nil){ 
     imgView = [[[UIImageView alloc] initWithImage:IMAGE] autorelease]; 
     [self.navigationController.navigationBar insertSubview:imgView atIndex:0]; 
    } 
    //EDIT: 
    else{ 
     [self.navigationController.navigationBar sendSubviewToBack:imgView]; 
    } 

    } 
    else{ 
    if(imgView) 
     [imgView removeFromSuperview]; 
    } 
} 

希望这有助于。

+0

谢谢你回答我的问题。但是我在这段代码中遇到了一些问题。 UIImageView * imgView = [self.navigationController.navigationBar viewWithTag:TAG];在标签设置导航栏或任何图像视图的TAG位置。我为导航栏设置了标记,然后在这里使用它,但它会给出警告。 – 2010-12-14 09:30:50

+0

@Viral \ Narshana:您应该使用一个唯一的整数来代替TAG。 aand抱歉,你还应该类型化视图:UIImageView * imgView =(UIImageView *)[[self.navigationController navigationBar] viewWithTag:1001] – 2010-12-14 10:17:45

+0

我得到了答案,但一个问题是图像隐藏导航栏的标题和按钮。我试过这个代码,但它不起作用。 [self.navigationController.navigationBar sendSubviewToBack:imageView];对此有何想法? – 2010-12-15 05:12:05

3

这应该去的地方你的导航控制器初始化,即MainViewController.m

// Set the background image of the navigation bar 
UIImage *image = [UIImage imageNamed:@"banner-with-logo.png"]; 
[self.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];