Jak zrobić całkowicie przezroczysty pasek nawigacji w iOS 7


127

Chcę, aby pasek UINavigationBar w mojej aplikacji był całkowicie przezroczysty i znajdował się na równi z kontrolerem widoku bezpośrednio pod nim. Jednak jedyny kod, jaki udało mi się znaleźć, jest półprzezroczysty, ale nieprzejrzysty. Wiem, że można to zrobić w iOS 7, ponieważ jest używany w aplikacji do notatek. Moje pytanie brzmi: jaki jest kod, którego użyli do tego?

Odpowiedzi:


296

Z tej odpowiedzi

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

Ponadto, zgodnie z sugestią Josha w komentarzach, aby przywrócić domyślną wartość paska:

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

6
Upewnij się również, że nie maszself.edgesForExtendedLayout = UIRectEdgeNone;
daidai

25
Czy jest sposób, aby to odwrócić?
Zorayr,

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: nil forBarMetrics: UIBarMetricsDefault]; przywróci domyślną wartość paska.
Josh

7
Czy istnieje sposób, aby przełączyć przezroczystość paska nawigacji animowaną za pomocą tej metody?
JYC

3
Implementuję to na scrollViewDidScroll i następuje skok. Jak naprawić?
onmyway133

77

Dla Swift3 i Swift4

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

Dla Swift2.2

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

W przypadku Objective-C

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

1
Dzięki temu jest to łatwy sposób na ustawienie całkowicie przezroczystego paska nawigacji
Hong Zhou,

39

Samodzielne rozwiązanie jako kategoria celu-C:

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

Teraz możesz zaimportować kategorię do swojego UIViewControlleri wywołać metody w kontrolerze nawigacji - na przykład:

#import "UINavigationController+TransparentNavigationController.h"

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

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

I podobne rozwiązanie w 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
  }
}

Jak mogę go ponownie wyświetlić (na przykład, jeśli nie chcę, aby był przezroczysty tylko w jednym widoku w NavigationController?) - czy mogę zresetować go do moich wartości domyślnych?
derdida

hideTransparentNavigationBar()powinien zresetować go z powrotem.
Zorayr

Wywołanie metod obecnych / ukrytych w viewWillAppear / Zniknięcie powoduje niewłaściwą animację przejścia między dwoma różnymi paskami nawigacji! Możesz to bardzo dobrze zobaczyć, wykonując gest machnięcia (od lewej do prawej) w pushedViewController
andreacipriani

Spróbuj wywołać go w viewDidHidenadrzędnym kontrolerze widoku.
Zorayr

1
Czarne tło jest wyświetlane w systemie iOS 11 podczas korzystania z LargeTitle podczas ukrywania przezroczystego paska nawigacyjnego
Vrutin Rathod,

15

Alan zapomniał o jednej linijce

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

Więc mam:

[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

Świetna odpowiedź @ Zorayra poprawiona do Swift 3:

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

Okazuje się, że wszystko, czego naprawdę potrzebujesz, to poniższy kod. Działa idealnie po włożeniu 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


-4

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

Ta jedna linijka wydawała mi się działać idealnie dla mnie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.