2013-03-04 10 views
18

Ich habe dieses Code-Schnipsel in ViewDidLoad eines UIViewController verwendet. Ich habe keine Fehler. Bilder existieren. Ich bekomme den Hintergrund, aber nicht das Bild. Das Bild ist eine Art Logo.Wie lege ich ein Bild in die Mitte der Navigationsleiste eines UIViewControllers?

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

Wenn Sie das Bild (Logo) in der Mitte der Navigationsleiste platzieren, dann über Ihren Titel? – Hari1251

+0

Sie müssen das Navigationselement des View-Controllers, das auf den Navigations-Stack geschoben wird, und nicht das Navigationselement des Navigations-Controllers selbst einstellen. Siehe meine Antwort. – jhabbott

Antwort

47

Die UINavigationController die Navigationsleiste verwaltet am navigationItem Eigenschaft der meisten Top-View-Controller, indem Sie auf dem Navigationsstapel. Um die Ansicht in ein Logo zu ändern, müssen Sie dies im View-Controller einrichten, der das Logo verwendet (d. H. Den Root-View-Controller oder einen anderen, der auf den Stack geschoben wird).

Do so etwas wie dies in viewDidLoad Ihren View-Controller:

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

In Ihrem Fall, setzen Sie den falschen Navigationspunkt:

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

was ist die Größe von UIImage sollte für Titel sein ?? Ich versuchte es mit 180 * 40, aber es wird verschwommen. – Krunal

+0

Lange Zeit seit OP und antworte, aber ich habe aufgelegt: 'self.navigationItem.titleView = logoView' sollte anstelle von' self.navigationController.navigationBar.topItem.titleView = logoView' verwendet werden, wenn ein neuer 'UIViewController' ist gedrückt werden, weil 'topItem' nicht den neuen View-Controller widerspiegelt, der gedrückt wurde, bis' viewDidAppear' ausgelöst wird (er spiegelt immer noch den alten View-Controller in 'viewDidLoad' und' viewWillAppear' wider). – spurgeon

+0

Kennt jemand den Rahmen des TitelView? –

1

Sie geben gerade Rahmen es von

logoView.frame = CGRectMake(initialize frame here); 

Dann verwenden Sie die folgende

[self.navigationItem setTitleView:logoView]; 
+0

Ihre Antwort ist die richtige Antwort, alle anderen geben an, wie ein Bild auf die Navigationsleiste gesetzt wird. Bei der Frage wird klar gefragt, wie das Bild in der Navigationsleiste zentriert werden soll. Vielen Dank. – oyalhi

+0

Nachdem ich das gesagt habe, habe ich den folgenden Code; Das Bild wird jedoch immer noch nicht zentriert. Je nachdem, was sich auf der linken/rechten Seite der Navigationsleiste befindet, zentriert sich das Logo auf dem leeren Platz, NICHT auf dem Bildschirm. Irgendwelche Zeiger?'let image = UIImage (benannt:" some_logo ")!' 'let screenWidth = UIScreen.mainScreen(). bounds.width' ' let imageView = UIImageView (Frame: CGRect (x: 0, y: 0, Breite: screenWidth, height: 42)) ' ' imageView.image = image' 'imageView.contentMode = .ScaleAspectFit' – oyalhi

9

Zuerst haben wir eine Ansicht erstellen haben, die haben Größe wie die Navigationsleiste fügen Sie dann eine Bildansicht hinzu und stellen Sie seinen Rahmen ein, wie er Mitte in der Navigationsleiste aussieht. Er funktioniert für alle ios Version und nimmt es automatisch fra Ich Größe wie pro Gerät (Retina oder normal) und funktioniert wie Magie.

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

Vielleicht nicht, was Sie wollen, aber ich lief in dieser Seite nach einer Möglichkeit, eine zentrierte Hintergrundbild für die Navigationsleiste zur Verfügung zu stellen, so, wenn Sie‘ Dafür hier ... hier ist ein Weg.

Wenn Sie ein wenig von another answer stehlen, können Sie Ihr Bild in Vorder- und Hintergrund zerlegen, dann ein neues Bild erstellen, das den Hintergrund ausdehnt und den Vordergrund zentriert, und dann als Hintergrundbild der Navigationsleiste festlegen. das Bild Aufbau funktioniert wie folgt:

// 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 
} 
} 

Hier ist, was ich verwende.

Natürlich könnten Sie ein wenig mehr Einschränkungen benötigen, um nicht mit den rechten und linken Elementen der Leiste zu kollidieren.

+0

Nach dem Versuch, eine wahnsinnige Menge an Antworten zu versuchen, hat Ihre schließlich funktioniert. Vielen Dank! –

Verwandte Themen