How to make completely transparent navigation bar in iOS 7
Asked Answered
A

8

127

I want the UINavigationBar in my app to be completely transparent and flush with the viewcontroller directly under it. However, the only code I could find makes it translucent but not transparent. I know this can be done in iOS 7 because it is used in the notes app. My question is, what is the code they used to do it?

Alec answered 29/9, 2013 at 20:32 Comment(0)
D
296

From this answer

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

Also, as suggested by Josh in the comments, to put the bar back to default:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];
Dezhnev answered 11/10, 2013 at 16:41 Comment(13)
When I do it (in a UIViewController), I have to change the code to say self.navigationController.navigationBar and all it does is change the bar to black.Alec
That code should be fine. It may just be the background colour, try adding self.navigationController.view.backgroundColor = [UIColor clearColor];Dezhnev
Also make sure you dont have self.edgesForExtendedLayout = UIRectEdgeNone;Gustav
Is there a way to reverse this?Gypsie
@Gypsie [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; will put the bar back to default.Kolnos
And if you need to change the color of the text once you've made your nav bar transparent, add self.navigationController.navigationBar.tintColor = [UIColor whiteColor];Belong
Works also on iOS 6.1Caldeira
This causes the navigationBar to show a black image for a second while navigation back it to. Is there a way to solve that?Spracklen
Is there any way to toggle navigation bar's transparency animated using this method?Untune
I implement this on scrollViewDidScroll and there's a jump. How to fix?Mannes
Thanks Shahid, I have edited the answer to include reversing the effect.Dezhnev
I used the accepted answer, the nav bar became transparent but the page scroll causes a jump on uipagecontroller, any suggestions on how that can be fixed?Cherise
Why my navigation color changed to black after this code applies? :(Peipus
D
79

For Swift3 and Swift4

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

For Swift2.2

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

For Objective-C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
Dabber answered 11/8, 2015 at 8:4 Comment(1)
Thanks this is an easy way to set the navigation bar to totally transparentDoxology
G
39

Self contained solution as an Objective-C Category:

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

Now, you can import the category in your UIViewController and call the methods on your navigation controller - for example:

#import "UINavigationController+TransparentNavigationController.h"

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

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

And a similar solution in 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
  }
}
Gypsie answered 22/12, 2014 at 22:26 Comment(5)
How can i show it again (for example if ill want to make it transparent only in 1 view in an NavigationController?) - can i reset it to my default values?Untwist
hideTransparentNavigationBar() should reset it back.Gypsie
Calling present/hide methods in viewWillAppear/disappear cause a bad transition animation between the two differents navigation bar! You can see it very well by doing the swipe gesture (from left to right) in the pushedViewControllerParamatta
Try calling it in viewDidHide of the parent view controller.Gypsie
Black background is shown on iOS 11 when using LargeTitle when hiding transparent navbarCerate
D
15

Alan forgot one line

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

So I have:

[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];
Disclaimer answered 21/10, 2014 at 16:7 Comment(0)
B
5

@Zorayr's great answer revised to 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
    }
}
Brogdon answered 5/2, 2017 at 1:43 Comment(0)
E
3

Swift 4.2 and iOS 12

It turns out all you really need is the code below. It works perfectly when you put it into 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
Edom answered 9/10, 2018 at 17:53 Comment(0)
U
-3

Use UINavigationBar+Addition pod, then simply call:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];
Unstoppable answered 23/9, 2015 at 14:49 Comment(0)
A
-4

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

That one line seemed to work perfectly for me

Aerial answered 5/4, 2016 at 8:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.