Antworten:
Wenn sich jemand fragt, wie dies in iOS 7+ erreicht werden kann, finden Sie hier eine Lösung (auch iOS 6-kompatibel).
In Ziel-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 schneller 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
Die Einstellung translucent
in YES
der Navigationsleiste reicht aufgrund eines in der UINavigationBar
Dokumentation beschriebenen Verhaltens aus . Ich werde hier das relevante Fragment melden:
Wenn Sie diese Eigenschaft in
YES
einer Navigationsleiste mit einem undurchsichtigen benutzerdefinierten Hintergrundbild festlegen , wendet die Navigationsleiste eine Systemopazität von weniger als 1,0 auf das Bild an.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
In iOS5 können Sie dies tun, um die Navigationsleiste transparent zu machen:
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]];
Von 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];
Für alle, die dies in Swift 2.x tun möchten:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
oder Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Das scheint zu funktionieren:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
eine Unterklasse überschreiben , nicht eine Kategorie, und diese Unterklasse dann als Navigationsleiste verwenden.
Nachdem Sie das getan haben, was alle anderen oben gesagt haben, dh:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... meine Navigationsleiste war noch weiß . Also habe ich diese Zeile hinzugefügt:
navigationController?.navigationBar.backgroundColor = .clear
... et voila! Das schien den Trick zu tun.
Wenn Sie mit der neuesten Beta-Version von iOS 13.4 und XCode 11.4 erstellen, funktioniert die akzeptierte Antwort nicht mehr. Ich habe einen anderen Weg gefunden, vielleicht ist es nur ein Fehler in der Beta-Software, aber ich schreibe ihn dort auf, nur für den Fall
(schnell 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
}
}
}
Ich weiß, dass dieses Thema alt ist, aber wenn die Leute wissen wollen, wie es gemacht wird, ohne die drawRect-Methode zu überladen.
Das brauchen Sie:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Der folgende Code erweitert die obere Antwort, die für diesen Thread ausgewählt wurde, um den unteren Rand zu entfernen und die Textfarbe festzulegen:
Die letzten beiden codierten Zeilen dieses Codes legen die Transparenz fest. Ich habe diesen Code aus diesem Thread ausgeliehen und er hat perfekt funktioniert!
Die "clipsToBounds" -Eigenschaft war Code, den ich gefunden habe und der die untere Grenzlinie mit ODER ohne eingestellte Transparenz entfernt hat (wenn Sie sich also stattdessen für einen durchgehenden weißen / schwarzen / etc. Hintergrund entscheiden, gibt es immer noch keine Grenzlinie).
Die Zeile "tintColor" (2. codierte Zeile) setzt meinen Zurück-Knopf auf hellgrau
Ich habe barTintColor als Backup behalten. Ich weiß nicht, warum Transparenz nicht funktionieren würde, aber wenn nicht, möchte ich, dass mein BG weiß ist, wie ich es früher hatte
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;
Eine andere Möglichkeit, die für mich funktioniert hat, besteht darin, UINavigationBar zu unterklassifizieren und die drawRect-Methode leer zu lassen !!
@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) und dann in viewWillDisappear, um es rückgängig zu machen, setzen
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
Meinen Sie damit völlig transparent oder verwenden Sie den durchscheinend-schwarzen Stil, der in der Foto-App angezeigt wird? Letzteres können Sie erreichen, indem Sie seine barStyle
Eigenschaft auf setzen UIBarStyleBlackTranslucent
. Ersteres ... da bin ich mir nicht sicher. Wenn Sie möchten, dass die darauf befindlichen Elemente weiterhin sichtbar sind, müssen Sie möglicherweise in der Ansichtshierarchie der Leiste herumgraben und die Ansicht mit dem Hintergrund entfernen.
Überprüfen Sie RRViewControllerExtension , das sich mit der Verwaltung des Erscheinungsbilds von UINavigation-Leisten befasst.
Mit RRViewControllerExtension in Ihrem Projekt müssen Sie nur überschreiben
-(BOOL)prefersNavigationBarTransparent;
in dir 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;