วิธีสร้างแถบการนำทางที่โปร่งใสอย่างสมบูรณ์ใน iOS 7


127

ฉันต้องการให้ UINavigationBar ในแอพของฉันโปร่งใสและล้างออกด้วย viewcontroller โดยตรง อย่างไรก็ตามรหัสเดียวที่ฉันสามารถค้นหาได้ทำให้มันโปร่งแสง แต่ไม่โปร่งใส ฉันรู้ว่าสิ่งนี้สามารถทำได้ใน iOS 7 เพราะมันถูกใช้ในแอพโน้ต คำถามของฉันคือรหัสที่พวกเขาใช้ทำอะไร

คำตอบ:


295

จากคำตอบนี้

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

นอกจากนี้ตามที่ Josh แนะนำไว้ในความคิดเห็นเพื่อให้แถบกลับไปเป็นค่าเริ่มต้น:

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

6
ตรวจสอบให้แน่ใจว่าคุณไม่มีself.edgesForExtendedLayout = UIRectEdgeNone;
daidai

25
มีวิธีการย้อนกลับนี้หรือไม่
Zorayr

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: ไม่มีสำหรับ BarMetrics: UIBarMetricsDefault]; จะใส่แถบกลับเป็นค่าเริ่มต้น
Josh

7
มีวิธีใดบ้างที่จะสลับความโปร่งใสของแถบการนำทางโดยใช้วิธีนี้?
JYC

3
ฉันใช้สิ่งนี้กับ scrollViewDidScroll และมีการกระโดด จะแก้ไขอย่างไร
onmyway133

77

สำหรับ Swift3 และ Swift4

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

สำหรับ Swift2.2

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

สำหรับวัตถุประสงค์ -C

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

1
ขอบคุณนี่เป็นวิธีที่ง่ายในการตั้งแถบนำทางให้โปร่งใสโดยสมบูรณ์
Hong Zhou

39

วิธีการแก้ปัญหาด้วยตนเองเป็นหมวดหมู่ 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

ตอนนี้คุณสามารถนำเข้าหมวดหมู่ในของคุณUIViewControllerและเรียกใช้เมธอดบนตัวควบคุมการนำทางของคุณได้ตัวอย่างเช่น

#import "UINavigationController+TransparentNavigationController.h"

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

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

และวิธีการแก้ปัญหาที่คล้ายกันใน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
  }
}

ฉันจะแสดงอีกครั้งได้อย่างไร (เช่นถ้าไม่ต้องการทำให้โปร่งใสใน 1 view ใน NavigationController?) - ฉันสามารถรีเซ็ตมันเป็นค่าเริ่มต้นได้หรือไม่?
derdida

hideTransparentNavigationBar()ควรรีเซ็ตมันกลับ
Zorayr

การเรียกใช้วิธีการนำเสนอ / ซ่อนใน viewWillAppear / หายไปทำให้แอนิเมชั่นการเปลี่ยนแปลงไม่ดีระหว่างแถบการนำทาง differents สองอัน! คุณสามารถดูได้เป็นอย่างดีโดยใช้ท่าทางการปัดนิ้ว (จากซ้ายไปขวา) ใน pushViewController
andreacipriani

ลองโทรหาในviewDidHideส่วนควบคุมมุมมองพาเรนต์
Zorayr

1
พื้นหลังสีดำแสดงบน iOS 11 เมื่อใช้ LargeTitle เมื่อซ่อน navbar แบบโปร่งใส
Vrutin Rathod

15

อลันลืมไปหนึ่งบรรทัด

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

ดังนั้นฉันมี:

[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

คำตอบที่ดีของ @ Zorayr แก้ไขเป็น 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 และ iOS 12

ปรากฎทั้งหมดที่คุณต้องการคือรหัสด้านล่าง 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];

บรรทัดนั้นดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.