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?

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

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;

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
  }
}

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

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
    }
}

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


-4

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

Satu baris itu sepertinya bekerja dengan baik untukku

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.