Come rendere la barra di navigazione completamente trasparente in iOS 7


127

Voglio che UINavigationBar nella mia app sia completamente trasparente e a filo con il viewcontroller direttamente sotto di esso. Tuttavia, l'unico codice che ho trovato lo rende traslucido ma non trasparente. So che questo può essere fatto in iOS 7 perché viene utilizzato nell'app Note. La mia domanda è: qual è il codice che hanno usato per farlo?

Risposte:


295

Da questa risposta

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                     forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

Inoltre, come suggerito da Josh nei commenti, per ripristinare la barra predefinita:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];

6
Assicurati anche di non averlo fattoself.edgesForExtendedLayout = UIRectEdgeNone;
daidai il

25
C'è un modo per invertire questo?
Zorayr,

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: nil forBarMetrics: UIBarMetricsDefault]; ripristinerà la barra ai valori predefiniti.
Josh

7
Esiste un modo per attivare / disattivare la trasparenza della barra di navigazione usando questo metodo?
JYC

3
Lo implemento su scrollViewDidScroll e c'è un salto. Come risolvere?
onmyway133,

77

Per Swift3 e Swift4

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true

Per Swift2.2

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
 self.navigationController?.navigationBar.shadowImage = UIImage()
 self.navigationController?.navigationBar.translucent = true

Per Objective-C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;

1
Grazie, questo è un modo semplice per impostare la barra di navigazione in modo totalmente trasparente
Hong Zhou,

39

Soluzione autonoma come categoria obiettivo-C:

UINavigationController + TransparentNavigationController.h

@interface UINavigationController (TransparentNavigationController)
- (void)presentTransparentNavigationBar;
- (void)hideTransparentNavigationBar;
@end

UINavigationController + TransparentNavigationController.m

#import "UINavigationController+TransparentNavigationController.h"

@implementation UINavigationController (TransparentNavigationController)

- (void)presentTransparentNavigationBar
{
  [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:YES];
  [self.navigationBar setShadowImage:[UIImage new]];
  [self setNavigationBarHidden:NO animated:YES];
}

- (void)hideTransparentNavigationBar
{
  [self setNavigationBarHidden:YES animated:NO];
  [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]];
  [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]];
}

@end

Ora puoi importare la categoria nella tua UIViewControllere chiamare i metodi sul tuo controller di navigazione, ad esempio:

#import "UINavigationController+TransparentNavigationController.h"

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  [self.navigationController presentTransparentNavigationBar];
}

- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];
  [self.navigationController hideTransparentNavigationBar];
}

E una soluzione simile in Swift :

import Foundation
import UIKit

extension UINavigationController {

  public func presentTransparentNavigationBar() {
    navigationBar.setBackgroundImage(UIImage(), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = true
    navigationBar.shadowImage = UIImage()
    setNavigationBarHidden(false, animated:true)
  }

  public func hideTransparentNavigationBar() {
    setNavigationBarHidden(true, animated:false)
    navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImageForBarMetrics(UIBarMetrics.Default), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = UINavigationBar.appearance().translucent
    navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
  }
}

Come posso mostrarlo di nuovo (ad esempio se non voglio renderlo trasparente solo in 1 vista in un NavigationController?) - Posso ripristinarlo ai miei valori predefiniti?
derdida,

hideTransparentNavigationBar()dovrebbe ripristinarlo.
Zorayr,

Chiamare i metodi presenti / nascosti in viewWillAppear / scomparire provoca una cattiva animazione di transizione tra le due diverse barre di navigazione! Puoi vederlo molto bene facendo il gesto di scorrimento (da sinistra a destra) nel pushedViewController
andreacipriani

Prova a chiamarlo nel viewDidHidecontroller della vista padre.
Zorayr,

1
Lo sfondo nero viene mostrato su iOS 11 quando si utilizza LargeTitle quando si nasconde la barra di navigazione trasparente
Vrutin Rathod,

15

Alan ha dimenticato una riga

self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

Quindi ho:

[self.navigationController.navigationBar setTranslucent:YES];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

5

La grande risposta di @ Zorayr rivista a Swift 3:

import Foundation
import UIKit

extension UINavigationController {

    public func presentTransparentNavigationBar() {
        navigationBar.setBackgroundImage(UIImage(), for:.default)
        navigationBar.isTranslucent = true
        navigationBar.shadowImage = UIImage()
        setNavigationBarHidden(false, animated:true)
    }

    public func hideTransparentNavigationBar() {
        setNavigationBarHidden(true, animated:false)
        navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:.default)
        navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent
        navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
    }
}

2

Swift 4.2 e iOS 12

Si scopre che tutto ciò di cui hai veramente bisogno è il codice seguente. Funziona perfettamente quando lo metti viewDidLoad().

// removes line at bottom of navigation bar
navigationController?.navigationBar.shadowImage = UIImage()

// makes navigation bar completely transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.isTranslucent = true


-4

[(UIView *) [self.navigationController.navigationBar.subviews objectAtIndex: 0] setAlpha: 0.0f];

Quell'unica linea sembrava funzionare perfettamente per me

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.