2013-11-15 7 views
9

Sto creando un'app e mi è stato chiesto di inserire un logo sulla barra di navigazione, ma anche di raggiungere i bordi esterni della barra, coprendo parte della mia vista. Questo è esattamente come deve essere posizionato (il cerchio bianco è il logo).Come aggiungere un'immagine sulla barra di navigazione di UINavigationController?

enter image description here

Grazie alla complicata struttura view controller in questa applicazione che voglio usare UINavigationController, ma sembra che potrebbe fare mettendo il logo un po 'più problematico.

Qual è un buon modo per farlo? (Visto che la immissione ovviamente logo immagine titolo di barra di navigazione come è fuori questione a causa di posizionamento strano)

Pensavo a uno che lo rende una visualizzazione secondaria di keyWindow o del navigationController.view. Il primo può causare il rifiuto della mia app da parte di Apple?

+0

ho recentemente posta risposta su domanda simile - dare un'occhiata al http://stackoverflow.com/questions/19878288/ios-custom-shape-navigation-bar – Kuba

risposta

13

Se si desidera aggiungere un'immagine da un UIViewController non da una sottoclasse di UINavigationController si può fare qualcosa di simile:

-(void)addImageOnTopOfTheNavigationBar { 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImage"]]; 

    imageView.frame = CGRectMake(....); //set the proper frame here 
    [self.navigationController.view addSubview:imageView]; 

} 
2

La barra di navigazione è qualcosa chiamato titleView. Ora questo può essere qualsiasi vista. Ma ci metto solo un'immagine.

Il mio è nella funzione di inizializzazione.

self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]]; 
+0

Come ho detto nella mia domanda, questo è Probabilmente non una buona idea. Soprattutto perché verrà ridimensionato per adattarsi al centro della barra di navigazione, mentre ne ho bisogno per allungare al di fuori dei bordi della barra. – johnyu

+0

ah abbastanza giusto :). è necessario aggiungere una sottoview come ha detto danypata. Assicurati di impostare l'autorizzo, altrimenti non rimarrà nel mezzo – mashdup

1
UIImage*image = [UIImage imageNamed:@"logo"]; 

float targetHeight = self.navigationController.navigationBar.frame.size.height; 
float logoRatio = image.size.width/image.size.height; 
float targetWidth = targetHeight * logoRatio; 

UIImageView*logoView = [[UIImageView alloc] initWithImage:image]; 
// X or Y position can not be manipulated because autolayout handles positions. 
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth)/2 , (self.navigationController.navigationBar.frame.size.height - targetHeight)/2 , targetWidth, targetHeight)]; 
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)]; 
self.navigationItem.titleView = logoView; 

// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/ 
[logoView setContentMode:UIViewContentModeScaleAspectFit]; 

/* Autolayout constraints also can not be manipulated since navigation bar has immutable constraints 
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false; 

NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]}; 
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView}; 

[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]]; 
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]]; 

NSLog(@"%f", self.navigationItem.titleView.width); 
*/ 

Quindi tutto abbiamo veramente bisogno è

UIImage*image = [UIImage imageNamed:@"logo"]; 
UIImageView*logoView = [[UIImageView alloc] initWithImage:image]; 
float targetHeight = self.navigationController.navigationBar.frame.size.height; 
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)]; 
[logoView setContentMode:UIViewContentModeScaleAspectFit]; 

self.navigationItem.titleView = logoView; 
2

lo si può fare da IB facilmente:

  1. Aggiungere un'immagine al controller (non nella gerarchia vista) enter image description here enter image description here
  2. Collega la vista del titolo di UINavigationItem a questa immagine enter image description here
  3. Et voilà! enter image description here