Risposte:
Se qualcuno si chiede come ottenere questo risultato in iOS 7+, ecco una soluzione (compatibile anche con iOS 6)
In Objective-C
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
In swift 3 (iOS 10)
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
In rapido 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
L'impostazione translucent
su YES
sulla barra di navigazione fa il trucco, a causa di un comportamento discusso nella UINavigationBar
documentazione. Riporterò qui il frammento pertinente:
Se si imposta questa proprietà
YES
su una barra di navigazione con un'immagine di sfondo personalizzata opaca, la barra di navigazione applicherà all'opacità un sistema inferiore a 1,0.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
In iOS5 puoi farlo per rendere trasparente la barra di navigazione:
nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];
[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault];
[img release];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Da IOS7:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Per chiunque voglia farlo in Swift 2.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
o Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Questo sembra funzionare:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
in una sottoclasse corretta, non in una categoria, quindi utilizzare questa sottoclasse come barra di navigazione.
Dopo aver fatto ciò che tutti gli altri hanno detto sopra, cioè:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... la mia barra di navigazione era ancora bianca . Quindi ho aggiunto questa riga:
navigationController?.navigationBar.backgroundColor = .clear
... et voilà! Sembrava fare il trucco.
Se costruisci con l'ultima beta iOS 13.4 e XCode 11.4, la risposta accettata non funzionerà più. Ho trovato un altro modo, forse è solo un bug nel software beta, ma lo scrivo lì, per ogni evenienza
(veloce 5)
import UIKit
class TransparentNavBar :UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
self.backgroundColor = .clear
if #available(iOS 13.0, *) {
self.standardAppearance.backgroundColor = .clear
self.standardAppearance.backgroundEffect = .none
self.standardAppearance.shadowColor = .clear
}
}
}
So che questo argomento è vecchio, ma se le persone vogliono sapere come è stato fatto senza sovraccaricare il metodo drawRect.
Questo è quello di cui hai bisogno:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Il codice seguente si espande sulla risposta superiore scelta per questo thread, per eliminare il bordo inferiore e impostare il colore del testo:
Le ultime due righe codificate di questo codice impostano la trasparenza. Ho preso in prestito quel codice da questo thread e ha funzionato perfettamente!
La proprietà "clipsToBounds" era il codice che ho trovato che si è sbarazzato della linea di confine inferiore con OR senza set di trasparenza (quindi se si decide di utilizzare uno sfondo bianco / nero / ecc. Solido, non ci sarà ancora alcuna linea di confine).
La linea "tintColor" (seconda riga codificata) imposta il mio pulsante indietro su un grigio chiaro
Ho mantenuto barTintColor come backup. Non so perché la trasparenza non funzionerebbe, ma in caso contrario, voglio il mio bianco come lo avevo prima
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.tintColor = UIColor.lightGray
navigationBarAppearace.barTintColor = UIColor.white
navigationBarAppearace.clipsToBounds = true
navigationBarAppearace.isTranslucent = true
navigationBarAppearace.setBackgroundImage(UIImage(), for: .default)
navigationBarAppearace.shadowImage = UIImage()
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
Un altro modo che ha funzionato per me è quello di sottoclassare UINavigationBar e lasciare vuoto il metodo drawRect !!
@IBDesignable class MONavigationBar: UINavigationBar {
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}}
In Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(in viewWillAppear), quindi in viewWillDisappear, per annullare l'operazione, inserisci
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
Vuoi dire completamente trasparente o usando lo stile nero traslucido visto nell'app Foto? Quest'ultimo è possibile realizzare impostando la sua barStyle
proprietà su UIBarStyleBlackTranslucent
. Il primo ... non ne sono sicuro. Se desideri che gli elementi su di esso siano ancora visibili, potresti dover scavare nella gerarchia della vista della barra e rimuovere la vista contenente il suo sfondo.
Controlla RRViewControllerExtension , dedicato alla gestione dell'aspetto della barra UINavigation.
con RRViewControllerExtension nel tuo progetto, devi solo eseguire l'override
-(BOOL)prefersNavigationBarTransparent;
nel tuo viewcontroller.
extension UINavigationBar {
var isTransperent: Bool {
get {
return false // Just to satisfy property
}
set {
if newValue == true {
self.shadowImage = UIImage()
self.isTranslucent = true
self.setBackgroundImage(UIImage(), for: .default)
}else{
self.shadowImage = UIImage()
self.isTranslucent = false
self.setBackgroundImage(nil, for: .default)
}
}
}
}
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;