Domanda

Sono riuscito ad aggiungere uno sfondo personalizzato alla mia barra di navigazione usando:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

Funziona bene e posso vedere il titolo e i pulsanti a posto. Tuttavia, quando eseguo il drill down di un livello e poi torno alla radice, i pulsanti sono nascosti, ma il titolo è ancora visibile. Sembra che l'immagine della barra di navigazione copra gli elementi del pulsante.

Sono confuso mentre lo sto inserendo in fondo, quindi suppongo che quando gli elementi di navigazione vengono spinti e spuntati che vengono visualizzati sopra altre viste nella barra di navigazione.

Qualche idea?

Grazie,

Mike

È stato utile?

Soluzione

Seguendo la descrizione da qui , suggerisco di aggiungere una categoria alla barra di navigazione.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end

Altri suggerimenti

Su iOS 5 non funzionerà, ma la buona notizia è che esiste un modo semplice per farlo

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

NOTA: funzionerà solo su iOS 5 e versioni successive, quindi assicurati di controllare la versione iOS se vuoi essere retrocompatibile.

Le visualizzazioni secondarie di NavigationBar cambiano costantemente, intendo che ogni visualizzazione appare / scompare, quindi non dovresti aspettarti di avere la visualizzazione immagine aggiunta all'indice 0 dell'array delle visualizzazioni secondarie.

Potresti provare ad aggiungere questo su viewDidAppear (in ogni viewcontroller che gestisce gli elementi di navigazione / :):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

Ho usato la soluzione di Hauek ma quando la barra ha un sapore diverso in altri controller, potrebbe dare qualche piccolo problema, comunque, questa non è né l'opzione migliore.

Spero che sia d'aiuto, almeno per capire perché quello che stavi facendo non funzionasse,

Invece di farlo in drawRect: puoi sovrascrivere il metodo drawLayer: inContext: in una classe della categoria UINavigationBar. All'interno del metodo drawLayer: inContext: , puoi disegnare l'immagine di sfondo che desideri utilizzare. Inoltre, puoi scegliere diverse immagini per gli orientamenti dell'interfaccia verticale e orizzontale se l'app supporta più orientamenti dell'interfaccia.

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

Questo progetto Xcode demo completo sulla personalizzazione dell'aspetto di UINavigationBar potrebbe anche essere utile.

Il modo in cui puoi semplicemente aggiungere un nuovo sfondo a UINavigationBar è il prossimo.

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top