536 Stimmen

Wie man die 1px untere Linie der UINavigationBar ausblendet

Ich habe eine App, bei der die Navigationsleiste manchmal mit dem Inhalt verschmelzen muss.

Weiß jemand, wie man diese lästige kleine Leiste loswerden oder ihre Farbe ändern kann?

Auf dem Bild unten habe ich die Situation - ich spreche von dieser 1px hohen Linie unter "Root View Controller"

Bildbeschreibung hier eingeben

897voto

Serhii Yakovenko Punkte 12136

Für iOS 13:

Verwenden Sie die .shadowColor Eigenschaft

Wenn diese Eigenschaft nil ist oder die klare Farbe enthält, zeigt die Leiste keinen Schatten an

Zum Beispiel:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearance

Für iOS 12 und früher:

Um dies zu tun, sollten Sie ein benutzerdefiniertes Schattenbild festlegen. Aber damit das Schattenbild angezeigt wird, müssen Sie auch ein benutzerdefiniertes Hintergrundbild festlegen, Zitat aus der Apple-Dokumentation:

Um ein benutzerdefiniertes Schattenbild anzuzeigen, muss auch ein benutzerdefiniertes Hintergrundbild mit der Methode setBackgroundImage(_:for:) festgelegt werden. Wenn das Standardhintergrundbild verwendet wird, wird unabhängig vom Wert dieser Eigenschaft das Standard-Schattenbild verwendet.

Also:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

Oben ist der einzige "offizielle" Weg, um es zu verbergen. Leider entfernt es die Transparenz der Leiste.

Ich möchte kein Hintergrundbild, nur Farbe.

Sie haben diese Optionen:

  1. Einfarbige Farbe, keine Transparenz:

     navigationBar.barTintColor = UIColor.redColor()
     navigationBar.isTranslucent = false
     navigationBar.setBackgroundImage(UIImage(), for: .default)
     navigationBar.shadowImage = UIImage()
  2. Kleines Hintergrundbild in Farbe erstellen und verwenden.

  3. Verwenden Sie die unten beschriebene 'hacky' Methode. Sie wird die Leiste auch transparent halten.

Wie bleibt die Leiste transparent?

Um die Transparenz beizubehalten, benötigen Sie einen anderen Ansatz, der wie ein Hack aussieht, aber gut funktioniert. Der Schatten, den wir entfernen möchten, ist ein Haarlinien-UIImageView irgendwo unter UINavigationBar. Wir können es finden und bei Bedarf ausblenden/einblenden.

Die nachfolgenden Anweisungen gehen davon aus, dass Sie die Haarlinie nur in einem Controller Ihrer UINavigationController-Hierarchie ausblenden müssen.

  1. Deklarieren Sie eine Instanzvariable:

    private var shadowImageView: UIImageView?
  2. Fügen Sie eine Methode hinzu, die dieses Schatten (Haarlinien) UIImageView findet:

    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
    
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }
  3. Fügen Sie viewWillAppear/viewWillDisappear Methoden hinzu/bearbeiten Sie diese:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        shadowImageView?.isHidden = false
    }

Dieselbe Methode sollte auch für die Haarlinie der UISearchBar, und (fast) alles andere, was Sie ausblenden müssen, funktionieren :)

Vielen Dank an @Leo Natan für die ursprüngliche Idee!

271voto

Vishnuvardhan Punkte 5052

Hier ist der Hack. Da er auf Schlüsselpfaden funktioniert, könnte er in Zukunft brechen. Aber im Moment funktioniert er wie erwartet.

Swift:

self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

Objective C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];

147voto

Rick Pastoor Punkte 3566

Wenn Sie nur eine einheitliche Navigationsleistenfarbe verwenden möchten und diese in Ihrem Storyboard eingerichtet haben, verwenden Sie diesen Code in Ihrer AppDelegate-Klasse, um den 1-Pixel-Rand über den Erscheinungsproxy zu entfernen:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

105voto

Tarek Hallak Punkte 18402

Versuchen Sie es mit diesem:

[[UINavigationBar appearance] setBackgroundImage: [UIImage new]  
                                   forBarMetrics: UIBarMetricsDefault];

[UINavigationBar appearance].shadowImage = [UIImage new];

Unten finden Sie die Erklärung (iOS7 NavigationBar):

enter image description here

Und überprüfen Sie diese SO-Frage: iOS7 - Ändern Sie die Farbe des UINavigationBar-Rahmens

71voto

OscarVGG Punkte 2610

Der schnelle Weg, es zu tun:

UINavigationBar.appearance().setBackgroundImage(UIImage(), für: .any, barMetrics: .default)
UINavigationBar.appearance().shadowImage = UIImage()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X