2009-09-04 13 views
6

Zastosowałem następujący kod do mojej aplikacji, aby zmienić obraz paska nawigacji.UINavigation bar background w telefonie iPhone

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
[self.navigationController.navigationBar setTintColor:[UIColor blackColor]]; 
[self setNavigationBarTitle]; 
} 
-(void)setNavigationBarTitle { 
UIView *aViewForTitle=[[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 45)] autorelease]; 
UIImageView *aImg=[[UIImageView alloc] initWithFrame:CGRectMake(-8, 0, 320, 45)]; 
aImg.image=[UIImage imageNamed:@"MyTabBG.png"]; 
[aViewForTitle addSubview:aImg]; [aImg release]; 
UILabel *lbl=[[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 305, 45)] autorelease]; 
lbl.backgroundColor=[UIColor clearColor]; lbl.font=[UIFont fontWithName:@"Trebuchet MS" size:22]; 
lbl.shadowColor=[UIColor blackColor]; [lbl setShadowOffset:CGSizeMake(1,1)]; 
lbl.textAlignment=UITextAlignmentCenter; lbl.textColor=[UIColor whiteColor]; [email protected]"Mobile Tennis Coach Overview"; 
[aViewForTitle addSubview:lbl]; 
[self.navigationItem.titleView addSubview:aViewForTitle]; 
} 

Zobacz następujące obrazy. Możesz zobaczyć problem, przed którym stoję.

alt text


alt text

Każdy kontroler widoku mojej aplikacji ma powyżej metody, aby ustawić tło paska nawigacji.

Kiedy popycham nowy kontroler widoku do mojej aplikacji. Pojawi się przycisk Wstecz.

Potrzebuję przycisku, aby się pojawił. Ale obraz powinien być za przyciskiem Wstecz.

Teraz jestem trochę zdezorientowany.

Czy możesz mi pomóc w związku z tym?

Z góry dziękuję za podzielenie się ze mną swoją wiedzą.

Wielkie dzięki.

+0

Hi Sagar, w jaki sposób normalny przycisk (czyli nie jest to przycisk z tyłu) czynią? Czy działa dobrze, czy też ma ten sam problem? – h4xxr

+0

w moim poprzednim kontrolerze nawigacyjnym - widok zniknie z metody - ustawiłem tytuł jako back - self.navigationItem.title = @ "back". –

Odpowiedz

6

Po irytujące nocy, znalazłem niewielki uszczypnąć do tego, jeśli używasz drawLayer. Dzięki funkcji drawRect podczas odtwarzania filmu lub filmu w serwisie youtube pasek nawigacyjny zostanie zastąpiony obrazem. I przeczytałem kilka postów, które spowodowały odrzucenie ich aplikacji.

@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    if([self isMemberOfClass:[UINavigationBar class]]) 
    { 
    UIImage *image = [UIImage imageNamed:@"navBarBackground.png"]; 
    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 

Jeżeli ten artykuł jest dokładna, wszystko powinno być w porządku z tym podejściem: http://developer.apple.com/iphone/library/qa/qa2009/qa1637.html

5

Krótka odpowiedź brzmi, że modyfikowanie struktury paska UINavigationBar nie jest obsługiwane przez firmę Apple. Naprawdę nie chcą, żebyś robił to, co próbujesz zrobić. To właśnie powoduje problem, który widzisz.

Proszę zgłoś radar żądający tej funkcji, aby uzyskać wystarczającą uwagę, aby zostać oficjalnie dodanym w pewnym momencie.

Po tym, aby rozwiązać problem, możesz dodać kategorię do UINavigationBar za pomocą metody -drawRect: i narysować obraz tła w tej metodzie. Coś jak to będzie działać:

- (void)drawRect:(CGRect)rect 
{ 
    static UIImage *image; 
    if (!image) { 
    image = [UIImage imageNamed: @"HeaderBackground.png"]; 
    if (!image) image = [UIImage imageNamed:@"DefaultHeader.png"]; 
    } 
    if (!image) return; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); 
} 
Powiązane problemy