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?

Cory Ginsberg
quelle

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];
Alan
quelle
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;
Vichhai
quelle
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
  }
}
Zorayr
quelle
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];
Damien Romito
quelle
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
    }
}
Diphaze
quelle
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
Trev14
quelle
-3

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

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];
Samwize
quelle
-4

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

Diese eine Zeile schien perfekt für mich zu funktionieren

user5679976
quelle