So erstellen Sie eine vollständig transparente Navigationsleiste in iOS 7


127

Ich möchte, dass die UINavigationBar in meiner App vollständig transparent und bündig mit dem Viewcontroller direkt darunter ist. Der einzige Code, den ich finden konnte, macht ihn jedoch durchscheinend, aber nicht transparent. Ich weiß, dass dies in iOS 7 möglich ist, da es in der Notizen-App verwendet wird. Meine Frage ist, welchen Code haben sie dafür verwendet?

Antworten:


295

Aus dieser Antwort

[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];

Wie von Josh in den Kommentaren vorgeschlagen, um die Leiste wieder auf den Standardwert zurückzusetzen:

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

6
self.edgesForExtendedLayout = UIRectEdgeNone;
Stellen

25
Gibt es eine Möglichkeit, dies umzukehren?
Zorayr

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: nil forBarMetrics: UIBarMetricsDefault]; setzt die Leiste wieder auf Standard.
Josh

7
Gibt es eine Möglichkeit, die mit dieser Methode animierte Transparenz der Navigationsleiste umzuschalten?
JYC

3
Ich implementiere dies auf scrollViewDidScroll und es gibt einen Sprung. Wie repariert man?
onmyway133

77

Für Swift3 und Swift4

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

Für Swift2.2

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

Für Ziel-C

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

1
Dank dies ist eine einfache Möglichkeit, die Navigationsleiste auf völlig transparent zu setzen
Hong Zhou

39

Eigenständige Lösung als Ziel-C-Kategorie:

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

Jetzt können Sie die Kategorie in Ihre importieren UIViewControllerund die Methoden auf Ihrem Navigationscontroller aufrufen - zum Beispiel:

#import "UINavigationController+TransparentNavigationController.h"

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

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

Und eine ähnliche Lösung 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
  }
}

Wie kann ich es wieder anzeigen (zum Beispiel, wenn ich es nur in einer Ansicht in einem NavigationController transparent machen möchte?) - kann ich es auf meine Standardwerte zurücksetzen?
derdida

hideTransparentNavigationBar()sollte es zurücksetzen.
Zorayr

Das Aufrufen von Present / Hide-Methoden in viewWillAppear / ignore führt zu einer schlechten Übergangsanimation zwischen den beiden unterschiedlichen Navigationsleisten! Sie können es sehr gut sehen, indem Sie die Wischgeste (von links nach rechts) im pushViewController ausführen
andreacipriani

Versuchen Sie es im viewDidHideübergeordneten View Controller aufzurufen .
Zorayr

1
Schwarzer Hintergrund wird auf iOS 11 angezeigt, wenn LargeTitle verwendet wird, wenn transparente Navigationsleiste ausgeblendet wird
Vrutin Rathod

15

Alan hat eine Zeile vergessen

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

Also habe ich:

[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

@ Zorayrs großartige Antwort wurde in Swift 3 überarbeitet:

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 und iOS 12

Es stellt sich heraus, dass alles, was Sie wirklich brauchen, der folgende Code ist. Es funktioniert perfekt, wenn Sie es einsetzen 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

-3

Verwenden Sie UINavigationBar + Addition pod und rufen Sie dann einfach auf:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];

-4

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

Diese eine Zeile schien perfekt für mich zu funktionieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.