iOS 7で完全に透明なナビゲーションバーを作成する方法


127

アプリのUINavigationBarを完全に透明にして、その直下のビューコントローラーでフラッシュする必要があります。しかし、私が見つけた唯一のコードはそれを半透明にしますが、透明にしません。これは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 12/12/13

25
これを逆にする方法はありますか?
Zorayr 2014年

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; バーをデフォルトに戻します。
Josh

7
この方法を使用してアニメーション化されたナビゲーションバーの透明度を切り替える方法はありますか?
JYC 2014年

3
これをscrollViewDidScrollに実装すると、ジャンプが発生します。直し方?
onmyway133 2014年

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

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

どうすれば再び表示できますか(たとえば、NavigationControllerの1つのビューでのみ透明にしたい場合)-デフォルト値にリセットできますか?
derdida、2015

hideTransparentNavigationBar()リセットする必要があります。
Zorayr、2015

viewWillAppear / disappearでpresent / hideメソッドを呼び出すと、2つの異なるナビゲーションバー間で不適切な遷移アニメーションが発生します。pushViewControllerで(左から右に)スワイプジェスチャーを実行すると、非常によく見ることができます
andreacipriani

viewDidHide親View Controllerでそれを呼び出してみてください。
Zorayr

1
透明なナビゲーションバーを非表示にしてLargeTitleを使用すると、iOS 11で黒い背景が表示される
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

-3

UINavigationBar + Additionポッドを使用して、次を呼び出すだけです。

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

-4

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

その一行は私には完璧に機能したようです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.