2010-12-13 4 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

возможно дубликат [Как изменить цвет фона в UINavigationBar?] (Http://stackoverflow.com/questions/4319112/how-do-i-change-the-background-of-a-uinavigationbar) –

+0

@middaparka это может быть возможный дубликат, но не полностью. Пожалуйста, проверьте мой ответ и подумайте об этом. –

ответ

3
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"background.png"] forBarMetrics:UIBarMetricsDefault]; 
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

Это добавит изображение с правильным размером в навигационную панель с центром.

/* 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, чей тег задает навигационную панель или любое изображение. Я установил тег для панели навигации, а затем использовал его здесь, но он дает предупреждение. –

+0

@Viral \ Narshana: Вы должны использовать уникальное целое вместо TAG. а также извините, что вы также должны выглядеть следующим образом: UIImageView * imgView = (UIImageView *) [[self.navigationController navigationBar] viewWithTag: 1001] –

+0

У меня есть ответ, но одна проблема заключается в том, что изображение скрывает заголовок и кнопки панели навигации. Я пробовал это кода, но он не работает. [self.navigationController.navigationBar sendSubviewToBack: imageView]; Есть идеи об этом? –

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];