2013-03-04 22 views
18

Ho questo snippet di codice utilizzato in viewDidLoad di un UIViewController. Non ho errori. Le immagini esistono. Ottengo lo sfondo ma non l'immagine. L'immagine è una sorta di logo.Come mettere un'immagine al centro della navigazioneBar di un UIViewController?

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 

    /* Background of navigationBar. */ 
    UIImage * navigationBarImage = [UIImage imageNamed:@"01_navbar_portrait.png"]; 
    [self.navigationController.navigationBar setBackgroundImage:navigationBarImage forBarMetrics:UIBarMetricsDefault]; 

    /* Image in navigationBar */ 
    UIImage * logoInNavigationBar = [UIImage imageNamed:@"01_logo.png"]; 
    UIImageView * logoView = [[UIImageView alloc] init]; 
    [logoView setImage:logoInNavigationBar]; 
    self.navigationController.navigationItem.titleView = logoView; 

} 
+0

se metti l'immagine (logo) al centro della barra di navigazione, quindi a proposito di titolo? – Hari1251

+0

È necessario impostare l'elemento di navigazione del controller di visualizzazione che viene inserito nella pila di navigazione, non l'elemento di navigazione del controller di navigazione stesso. Vedi la mia risposta. – jhabbott

risposta

47

Il UINavigationController gestisce la barra di navigazione, cercando al navigationItem proprietà del più in alto controller della vista sullo stack di navigazione. Quindi, per cambiare la vista in un logo, è necessario impostarlo nel controller della vista che utilizza il logo (ad esempio il controller della vista radice o un altro che viene inserito nello stack).

fare qualcosa di simile in viewDidLoad del vostro controller della vista:

UIImage* logoImage = [UIImage imageNamed:@"logo.png"]; 
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:logoImage]; 

Nel tuo caso, si sta impostando la voce di navigazione sbagliato:

// Oops... 
self.navigationController.navigationItem.titleView = logoView; 
// Should be this: 
self.navigationItem.titleView = logoView; 
+4

qual è la dimensione di UIImage dovrebbe essere per il titolo ?? ho provato con 180 * 40 ma sta diventando sfocato. – Krunal

+0

Molto tempo dopo OP e risposta, ma mi sono bloccato su questo: 'self.navigationItem.titleView = logoView' dovrebbe essere usato al posto di' self.navigationController.navigationBar.topItem.titleView = logoView' quando un nuovo 'UIViewController' è essere spinto perché 'topItem' non riflette il nuovo controller di visualizzazione che è stato premuto fino a quando' viewDidAppear' si attiva (riflette ancora il vecchio controller di vista in 'viewDidLoad' e' viewWillAppear'). – spurgeon

+0

Qualcuno conosce il frame del titleView? –

1

Basta specificare che è fotogramma per

logoView.frame = CGRectMake(initialize frame here); 

quindi utilizzare i seguenti

[self.navigationItem setTitleView:logoView]; 
+0

La tua risposta è la risposta corretta, tutti gli altri specificano 'come' per mettere un'immagine sulla barra di navigazione. La domanda chiede chiaramente come centrare l'immagine sulla barra di navigazione. Grazie. – oyalhi

+0

Detto questo, ho il seguente codice; tuttavia, continua a non centrare l'immagine. A seconda di ciò che si trova sul lato sinistro/destro della barra di navigazione, il logo si concentra sullo spazio vuoto, NON sullo schermo. Qualche indicazione?'let image = UIImage (named:" some_logo ")!' 'let screenWidth = UIScreen.mainScreen(). bounds.width' ' let imageView = UIImageView (frame: CGRect (x: 0, y: 0, larghezza: screenWidth, height: 42)) ' ' imageView.image = image' 'imageView.contentMode = .ScaleAspectFit' – oyalhi

9

Per prima cosa dobbiamo creare una vista che hanno dimensione uguale alla barra di navigazione quindi aggiungi una visualizzazione immagine e imposta il fotogramma come appare al centro nella barra di navigazione. Funziona per tutte le versioni ios e che prende automaticamente fra la mia taglia come per dispositivo (retina o normale) e funziona come per magia.

UIView *headerView = [[UIView alloc] init]; 
headerView.frame = CGRectMake(0, 0, 320, 44); 

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Header.png"]]; 
imgView.frame = CGRectMake(75, 0, 150, 44); 
imgView.contentMode = UIViewContentModeScaleAspectFit; 

[headerView addSubview:imgView]; 

navigationCtrl.navigationBar.topItem.titleView = headerView; 

[headerView release]; 
[imgView release]; 
5

Swift:

var logoImage:UIImage = UIImage(named: "logo_text")! 
self.navigationItem.titleView = UIImageView(image: logoImage) 
2

Forse non è quello che volevi dire, ma mi sono imbattuto in questa pagina alla ricerca di un modo per fornire un'immagine di centrato sfondo per la barra di navigazione, quindi nel caso in cui' sei qui per quello ... ecco un modo.

Per rubare un po 'da another answer, è possibile suddividere l'immagine in primo piano e sullo sfondo, quindi creare una nuova immagine che stende lo sfondo e centra il primo piano, quindi imposta tale immagine come sfondo della barra di navigazione. Costruire l'immagine funziona in questo modo:

// build an image by stretching the bg, then merging it with the fg 
CGSize barSize = self.navController.navigationBar.frame.size; 
UIImage *fg = [UIImage imageNamed:@"some_fg"]; 
UIImage *bg = [[UIImage imageNamed:@"some_bg"] 
       resizableImageWithCapInsets:UIEdgeInsetsMake(0.f,1.f,0.f,1.f)]; 
UIGraphicsBeginImageContextWithOptions(barSize, NO, 0.0); 
[bg drawInRect:CGRectMake(0, 0, barSize.width, barSize.height)]; 
[fg drawInRect:CGRectMake((barSize.width-fg.size.width)/2.f, 
          0, 
          fg.size.width, 
          fg.size.height)]; 
// grab the merged images 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
2
extension UINavigationController { 
func addLogoImage(image: UIImage, navItem: UINavigationItem) { 
    let imageView = UIImageView(image: image) 
    imageView.contentMode = .scaleAspectFit 
    imageView.translatesAutoresizingMaskIntoConstraints = false 

    let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 44)) 
    view.addSubview(imageView) 

    navItem.titleView = view 
    imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
    imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    imageView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true 
    imageView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 

    view.heightAnchor.constraint(equalTo: navigationBar.heightAnchor).isActive = true 
    view.centerXAnchor.constraint(equalTo: navigationBar.centerXAnchor).isActive = true 
    view.centerYAnchor.constraint(equalTo: navigationBar.centerYAnchor).isActive = true 
} 
} 

Ecco quello che sto usando.

Ovviamente, potrebbe essere necessario un po 'più di vincoli, in modo da non scontrarsi con gli elementi dei pulsanti della barra destra e sinistra.

+0

Dopo aver provato una quantità folle di risposte, la tua ha finalmente funzionato. Grazie! –

Problemi correlati