Cara membuat bilah navigasi yang sepenuhnya transparan di iOS 7

127

Saya ingin UINavigationBar di aplikasi saya sepenuhnya transparan dan rata dengan viewcontroller langsung di bawahnya. Namun, satu-satunya kode yang dapat saya temukan membuatnya tembus tetapi tidak transparan. Saya tahu ini bisa dilakukan di iOS 7 karena digunakan di aplikasi catatan. Pertanyaan saya adalah, kode apa yang mereka gunakan untuk melakukannya?

cory ginsberg
sumber

Jawaban:

295

Dari jawaban ini

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

Juga, seperti yang disarankan oleh Josh dalam komentar, untuk mengembalikan bilah ke default:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];
Alan
sumber
6
Pastikan juga Anda tidak memilikinyaself.edgesForExtendedLayout = UIRectEdgeNone;
daidai
25
Apakah ada cara untuk membalikkan ini?
Zorayr
12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: nil forBarMetrics: UIBarMetricsDefault]; akan mengembalikan bilah ke default.
Josh
7
Apakah ada cara untuk mengaktifkan transparansi transparansi bilah navigasi menggunakan metode ini?
JYC
3
Saya menerapkan ini pada scrollViewDidScroll dan ada lompatan. Bagaimana cara memperbaiki?
onmyway133
77

Untuk Swift3 dan Swift4

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

Untuk Swift2.2

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

Untuk Objective-C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
vichhai
sumber
1
Terima kasih, ini adalah cara mudah untuk mengatur bilah navigasi agar benar-benar transparan
Hong Zhou
39

Solusi mandiri sebagai Kategori Objective-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

Sekarang, Anda dapat mengimpor kategori di Anda UIViewControllerdan memanggil metode pada pengontrol navigasi Anda - misalnya:

#import "UINavigationController+TransparentNavigationController.h"

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

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

Dan solusi serupa di 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
sumber
Bagaimana saya bisa menampilkannya lagi (misalnya jika saya ingin membuatnya transparan hanya dalam 1 tampilan di NavigationController?) - dapatkah saya meresetnya ke nilai default saya?
derdida
hideTransparentNavigationBar()harus mengatur ulang kembali.
Zorayr
Memanggil metode sekarang / sembunyikan di viewWillAppear / menghilang menyebabkan animasi transisi yang buruk antara dua bilah navigasi yang berbeda! Anda dapat melihat dengan sangat baik dengan melakukan gerakan swipe (dari kiri ke kanan) di pushedViewController
andreacipriani
Coba panggil viewDidHidedari pengendali tampilan induk.
Zorayr
1
Latar belakang hitam ditampilkan di iOS 11 saat menggunakan LargeTitle ketika menyembunyikan transparan navbar
Vrutin Rathod
15

Alan lupa satu baris

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

Jadi saya punya:

[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
sumber
5

@ Jawaban bagus Zorayr direvisi menjadi 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
    }
}
Diphaze
sumber
2

Swift 4.2 dan iOS 12

Ternyata yang benar-benar Anda butuhkan adalah kode di bawah ini. Ini berfungsi dengan baik ketika Anda memasukkannya ke dalam 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
sumber
-3

Gunakan UINavigationBar + Addition pod, lalu panggil saja:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];
samwize
sumber
-4

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

Satu baris itu sepertinya bekerja dengan baik untukku

pengguna5679976
sumber