İOS 7'de tamamen şeffaf gezinme çubuğu nasıl yapılır


127

Uygulamamdaki UINavigationBar'ın tamamen şeffaf olmasını ve doğrudan altındaki viewcontroller ile aynı hizada olmasını istiyorum. Ancak bulabildiğim tek kod onu yarı saydam yapıyor ama saydam değil. Notlar uygulamasında kullanıldığı için bunun iOS 7'de yapılabileceğini biliyorum. Sorum şu, bunu yapmak için kullandıkları kod nedir?

Yanıtlar:


295

Gönderen bu cevap

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

Ayrıca, Josh'un yorumlarda önerdiği gibi çubuğu varsayılana geri getirmek için:

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

6
Ayrıca sahip olmadığınızdan da emin olunself.edgesForExtendedLayout = UIRectEdgeNone;
daidai

25
Bunu tersine çevirmenin bir yolu var mı?
Zorayr

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: nil forBarMetrics: UIBarMetricsDefault]; çubuğu varsayılana geri döndürür.
Josh

7
Bu yöntem kullanılarak animasyonlu gezinme çubuğunun şeffaflığını değiştirmenin herhangi bir yolu var mı?
JYC

3
Bunu scrollViewDidScroll'da uyguluyorum ve bir sıçrama var. Nasıl düzeltilir?
onmyway133

77

Swift3 ve Swift4 için

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

Swift2.2 için

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

Objective-C için

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

1
Teşekkürler bu, gezinme çubuğunu tamamen şeffaf hale getirmenin kolay bir yolu
Hong Zhou

39

Amaç-C Kategorisi olarak kendi kendine yeten çözüm:

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

Şimdi, kategorinizi içeri aktarabilir ve UIViewControllergezinme denetleyicinizdeki yöntemleri çağırabilirsiniz - örneğin:

#import "UINavigationController+TransparentNavigationController.h"

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

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

Ve Swift'de benzer bir çözüm :

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

Bunu tekrar nasıl gösterebilirim (örneğin, bir NavigationController'da onu yalnızca 1 görünümde şeffaf yapmak istersem?) - varsayılan değerlerime sıfırlayabilir miyim?
derdida

hideTransparentNavigationBar()geri sıfırlamalıdır.
Zorayr

Görünümde göster / gizle yöntemlerini çağırmak, iki farklı gezinme çubuğu arasında kötü bir geçiş animasyonuna neden olur! İtilenViewController
andreacipriani 9'15

viewDidHideÜst görünüm denetleyicisinden çağırmayı deneyin .
Zorayr

1
Şeffaf gezinme çubuğunu gizlerken LargeTitle kullanıldığında iOS 11'de siyah arka plan gösteriliyor
Vrutin Rathod

15

Alan bir satırı unuttu

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

Yani bende:

[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'ın harika cevabı Swift 3'e revize edildi:

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

Görünüşe göre gerçekten ihtiyacınız olan tek şey aşağıdaki kod. İçine koyduğunuzda mükemmel çalışıyor 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

-3

UINavigationBar + Ekleme bölmesini kullanın , ardından şunu arayın:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];

-4

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

Bu bir satır benim için mükemmel çalışıyor gibiydi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.