Transparent iOS navigation bar - ios
I'm creating an app and i've browsed on the internet and i'm wondering how they make this transparent UINavigationBar like this:
I've added following like in my appdelegate:
UINavigationBar.appearance().translucent = true
but this just makes it look like following:
How can I make the navigation bar transparent like first image?
You can apply Navigation Bar Image like below for Translucent.
Objective-C:
[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault]; //UIImageNamed:#"transparent.png"
self.navigationController.navigationBar.shadowImage = [UIImage new];////UIImageNamed:#"transparent.png"
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];
Swift 3:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) //UIImage.init(named: "transparent.png")
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = .clear
Swift Solution
This is the best way that I've found. You can just paste it into your appDelegate's didFinishLaunchingWithOptions method:
Swift 3 / 4
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Sets background to a blank/empty image
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
// Sets shadow (line below the bar) to a blank image
UINavigationBar.appearance().shadowImage = UIImage()
// Sets the translucent background color
UINavigationBar.appearance().backgroundColor = .clear
// Set translucent. (Default value is already true, so this can be removed if desired.)
UINavigationBar.appearance().isTranslucent = true
return true
}
Swift 2.0
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
// Sets background to a blank/empty image
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
// Sets shadow (line below the bar) to a blank image
UINavigationBar.appearance().shadowImage = UIImage()
// Sets the translucent background color
UINavigationBar.appearance().backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
// Set translucent. (Default value is already true, so this can be removed if desired.)
UINavigationBar.appearance().translucent = true
return true
}
source: Make navigation bar transparent regarding below image in iOS 8.1
Swift 5 applying only to the current view controller
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Make the navigation bar background clear
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Restore the navigation bar to default
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.shadowImage = nil
}
Swift 3 : extension for Transparent Navigation Bar
extension UINavigationBar {
func transparentNavigationBar() {
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
}
}
Swift 4.2 Solution: For transparent Background:
For General Approach:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
}
For Specific Object:
override func viewDidLoad() {
super.viewDidLoad()
navBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
navBar.shadowImage = UIImage()
navBar.navigationBar.isTranslucent = true
}
Hope it's useful.
I had been working on this, and I was facing a problem using the responses provided here by different users. Problem was a white box behind my NavigationBar transparent image on iOS 13+
My solution is this one
if #available(iOS 13, *) {
navBar?.standardAppearance.backgroundColor = UIColor.clear
navBar?.standardAppearance.backgroundEffect = nil
navBar?.standardAppearance.shadowImage = UIImage()
navBar?.standardAppearance.shadowColor = .clear
navBar?.standardAppearance.backgroundImage = UIImage()
}
Update
thanks to #TMin
If you use a tableView/CollectionView with this you will notice a 1 point shadow appears when you scroll. Add navBar?.scrollEdgeAppearance = nil to get ride of this shadow.
Hope this helps anyone with same problem
I was able to accomplish this in swift this way:
let navBarAppearance = UINavigationBar.appearance()
let colorImage = UIImage.imageFromColor(UIColor.morselPink(), frame: CGRectMake(0, 0, 340, 64))
navBarAppearance.setBackgroundImage(colorImage, forBarMetrics: .Default)
where i created the following utility method in a UIColor category:
imageFromColor(color: UIColor, frame: CGRect) -> UIImage {
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
color.setFill()
UIRectFill(frame)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
What it worked for me:
let bar:UINavigationBar! = self.navigationController?.navigationBar
self.title = "Whatever..."
bar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
bar.shadowImage = UIImage()
bar.alpha = 0.0
Set the background property of your navigationBar, e.g.
navigationController?.navigationBar.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.5)
(You may have to change that a bit if you don't have a navigation controller, but that should give you an idea of what to do.)
Also make sure that the view below actually extends under the bar.
If you want to be able to do this programmatically in swift 4 while staying on the same view,
if change {
navigationController?.navigationBar.isTranslucent = false
self.navigationController?.navigationBar.backgroundColor = UIColor(displayP3Red: 255/255, green: 206/255, blue: 24/255, alpha: 1)
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 255/255, green: 206/255, blue: 24/255, alpha: 1)
} else {
navigationController?.navigationBar.isTranslucent = true
navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
navigationController?.navigationBar.backgroundColor = .clear
navigationController?.navigationBar.barTintColor = .clear
}
One important thing to remember though is to click this button in your storyboard. I had an issue with a jumping display for a long time. Make sureyou set this:
Then when you change the translucency of the navigation bar it will not cause the views to jump as the views extend all the way to the top, regardless of the visiblity of the navigation bar.
Add this in your did load
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.0)
//adjust alpha according to your need 0 is transparent 1 is solid
For those looking for OBJC solution, to be added in App Delegate didFinishLaunchingWithOptions method:
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[UINavigationBar appearance].shadowImage = [UIImage new];
[UINavigationBar appearance].backgroundColor = [UIColor clearColor];
[UINavigationBar appearance].translucent = YES;
Try this, it works for me if you also need to support ios7, it is based on the transparency of UItoolBar:
[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];
UIToolbar* blurredView = [[UIToolbar alloc] initWithFrame:self.navigationController.navigationBar.bounds];
[blurredView setBarStyle:UIBarStyleBlack];
[blurredView setBarTintColor:[UIColor redColor]];
[self.navigationController.navigationBar insertSubview:blurredView atIndex:0];
iOS 13.0+ introduced UINavigationBarAppearance because of which, this problem occurs on iOS 13.0+
Use this to solve.
Change Navigation Bar Appearance
Use UINavigationBarAppearance and UIBarButtonItemAppearance to change the appearance of the navigation bar.
// Make the navigation bar's title with red text.
if #available(iOS 13, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UIColor.systemRed
appearance.titleTextAttributes = [.foregroundColor: UIColor.lightText] // With a red background, make the title more readable.
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance // For iPhone small navigation bar in landscape.
}
Utility method which you call by passing navigationController and color which you like to set on navigation bar. For transparent you can use clearColor of UIColor class.
For objective c -
+ (void)setNavigationBarColor:(UINavigationController *)navigationController
color:(UIColor*) color {
[navigationController setNavigationBarHidden:false animated:false];
[navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[navigationController.navigationBar setShadowImage:[UIImage new]];
[navigationController.navigationBar setTranslucent:true];
[navigationController.view setBackgroundColor:color];
[navigationController.navigationBar setBackgroundColor:color];
}
For Swift 3.0 -
class func setNavigationBarColor(navigationController : UINavigationController?,
color : UIColor) {
navigationController?.setNavigationBarHidden(false, animated: false)
navigationController?.navigationBar .setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.translucent = true
navigationController?.view.backgroundColor = color
navigationController?.navigationBar.backgroundColor = color
}
Write these two lines:
navigationController?.navigationBar.isTranslucent = true
navigationController?.navigationBar.backgroundColor = .clear
Worked for me in iOS 13
None of the answers here fully worked for me. This makes the navigation bar fully transparent - tested on iOS 14 and iOS 11 (Objective C):
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Anyone looking for a iOS 15+ working version, this is what worked for me, as the old techniques with setBackgroundImage/shadowImage were not working anymore.
To se it transparent:
func setTransparent() {
backgroundColor = .clear
isTranslucent = true
standardAppearance.shadowColor = .clear
standardAppearance.backgroundColor = .clear
standardAppearance.backgroundEffect = nil
scrollEdgeAppearance = standardAppearance
}
To remove transparency:
func removeTransparent() {
setBackgroundImage(nil, for: .default)
shadowImage = nil
backgroundColor = .white
isTranslucent = false
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
standardAppearance = appearance
scrollEdgeAppearance = standardAppearance
}
My implementation of navigation bar configuration as translucent and switching to default state for iOS 15 and older versions:
extension UINavigationBar {
static let defaultBackgroundColor = UIColor.red
static let defaultTintColor = UIColor.white
func setTranslucent(tintColor: UIColor, titleColor: UIColor) {
if #available(iOS 15, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
appearance.titleTextAttributes = [.foregroundColor: titleColor]
standardAppearance = appearance
scrollEdgeAppearance = appearance
} else {
titleTextAttributes = [.foregroundColor: titleColor]
setBackgroundImage(UIImage(), for: UIBarMetrics.default)
shadowImage = UIImage()
}
isTranslucent = true
self.tintColor = tintColor
}
func setDefaultState() {
isTranslucent = false
clipsToBounds = false
if #available(iOS 15, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UINavigationBar.defaultBackgroundColor
appearance.titleTextAttributes = [.foregroundColor: UINavigationBar.defaultTintColor]
UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
} else {
setBackgroundImage(UIImage(), for: UIBarPosition.any, barMetrics: UIBarMetrics.defaultPrompt)
shadowImage = UIImage()
barTintColor = UINavigationBar.defaultBackgroundColor
titleTextAttributes = [.foregroundColor: UINavigationBar.defaultTintColor]
}
tintColor = UINavigationBar.defaultTintColor
}
}
This will defiantly work for swift 4/5 users.
func setUpNavBar(){
navigationItem.title = "Flick"
navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}
IOS15 Version
extension UIViewController {
func clearNavigationBar(clear: Bool) {
if clear {
let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
} else {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
}
}
}
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
clearNavigationBar(clear: true)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
clearNavigationBar(clear: false)
}
}
For above all iOS version
if #available(iOS 15.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundImage = UIColor.clear.imageWithColor(width: UIScreen.main.bounds.size.width, height: 84)
appearance.shadowImage = UIImage()
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black ,NSAttributedString.Key.font : UIFont(name: "SF UI Display Semibold", size: 18) ?? UIFont()]
appearance.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: 2)
self.navigationBar.standardAppearance = appearance
} else {
self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black ,NSAttributedString.Key.font : UIFont(name: "SF UI Display Semibold", size: 18) ?? UIFont()]
self.navigationBar.setTitleVerticalPositionAdjustment(2, for: UIBarMetrics.default)
}
func imageWithColor(width: CGFloat, height: CGFloat) -> UIImage {
let size = CGSize(width: width, height: height)
return UIGraphicsImageRenderer(size: size).image { rendererContext in
self.setFill()
rendererContext.fill(CGRect(origin: .zero, size: size))
}
}
Just add bellow code line inside your application delegate
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
// Sets shadow (line below the bar) to a blank image
UINavigationBar.appearance().shadowImage = UIImage()
// Sets the translucent background color
UINavigationBar.appearance().backgroundColor = .clear
// Set translucent. (Default value is already true, so this can be removed if desired.)
UINavigationBar.appearance().isTranslucent = true
then override your custom nav bar inside your view controller and make sure to reset once it disappear
Related
Unable to change the color to tabBar?
I have the following method in the parantTabBarController class: There can be seen various attempts made to make the tabBar completely transparent. The only one that worked is the one found at the top. override func viewDidLoad() { super.viewDidLoad() UITabBar.appearance().barTintColor = UIColor.clear UITabBar.appearance().backgroundImage = UIImage() // UITabBar.appearance().barTintColor = UIColor.blue // changeTabBarOpacity() // self.tabBar.unselectedItemTintColor = UIColor(red: 17.0/255.0, green: 70.0/255.0, blue: 95.0/255.0, alpha: 0.4) // self.tabBar.backgroundColor = UIColor(red: 17.0/255.0, green: 70.0/255.0, blue: 95.0/255.0, alpha: 0.0) // self.tabBar.backgroundColor = UIColor.clear // self.tabBar.backgroundImage = UIImage() // self.tabBar.shadowImage = UIImage() // removes the border } However with this approach I am not able to change the background color of this same tabBar in other view controllers. I have tried replacing the image with a white image, changing the background color: UITabBar.appearance().backgroundColor = UIColor.white But nothing works. How can I have a translucent tabBar on one page and a white one on all others?
I use this code to configure tab bar in custom subclass of UITabBarController. It supports iOS 15 and XCode 13 updates. let backgroundColor = UIColor.red let selectedItemTextColor = UIColor.black let unselectedItemTextColor = UIColor.white if #available(iOS 15, *) { let tabBarAppearance = UITabBarAppearance() tabBarAppearance.backgroundColor = backgroundColor tabBarAppearance.stackedLayoutAppearance.selected.titleTextAttributes = [.foregroundColor: selectedItemTextColor] tabBarAppearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor: unselectedItemTextColor] tabBar.standardAppearance = tabBarAppearance tabBar.scrollEdgeAppearance = tabBarAppearance } else { UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor: selectedItemTextColor], for: .selected) UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor: unselectedItemTextColor], for: .normal) tabBar.barTintColor = backgroundColor }
Swift 5 : Okay i found the solution, the main key is using the isTranslucent property of UITabBar. If you send isTranslucent : true to a tab bar with an opaque custom background image the tab bar will apply a system opacity less than 1.0 to the image. if you want to set clear color then u just have to set isTranslucent to true only. and if you want to apply other colors then set isTranslucent to false. Use the below TabBarViewController class to your TabBarViewController class TabBarViewController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDidLoad() self.delegate = self self.tabBar.isTranslucent = true UITabBar.appearance().backgroundImage = UIImage() //This is for removing top line from the tabbar. UITabBar.appearance().layer.borderWidth = 0.0 UITabBar.appearance().clipsToBounds = true } // This method will get called when you tap on any tab func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { if viewController == tabBarController.viewControllers?[0] { //<----- This is first viewController //If you set isTranslucent to true then no need to set barTintColor. it will make your tabBar transparent self.tabBar.isTranslucent = true } else if viewController == tabBarController.viewControllers?[1] { //<----- This is second viewController self.tabBar.isTranslucent = false // the tab bar will provide an opaque background black for UIBarStyleBlack or white for UIBarStyleDefault if barTintColor is nil. self.tabBar.barTintColor = .white // OR // self.tabBar.barTintColor = nil } else { self.tabBar.isTranslucent = false self.tabBar.barTintColor = .red } return true } } Output : - Hope this helps
#isa123 try this code in appdelegate didFinishLaunchingWithOptions method UITabBar.appearance().tintColor = .white UITabBar.appearance().barTintColor = UIColor(named: "PrimaryDark") UITabBar.appearance().isOpaque = false UITabBar.appearance().backgroundImage = UIImage.init(color: UIColor(named: "PrimaryDark")!, size: CGSize(width: 1, height: 1))
Problem with NavBar in iOS 13 doesn't show [duplicate]
On ios13, with iphone x, the large title navigation does not cover the status bar however when scrolling and transitioning into the traditional nav bar, it works perfectly. This doesn't affect devices without the notch. Large titles Traditional navigation bar It's all embedded within a navigation controller so i'm lost as to why this is happening. Cheers
The official way to customize the UINavigationBar, pre iOS 13, is this: // text/button color UINavigationBar.appearance().tintColor = .white // background color UINavigationBar.appearance().barTintColor = .purple // required to disable blur effect & allow barTintColor to work UINavigationBar.appearance().isTranslucent = false iOS 13 has changed how navigation bars work, so you'll need to do things slightly differently to support both old & new: if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.backgroundColor = .purple appearance.titleTextAttributes = [.foregroundColor: UIColor.white] appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white] UINavigationBar.appearance().tintColor = .white UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().compactAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance } else { UINavigationBar.appearance().tintColor = .white UINavigationBar.appearance().barTintColor = .purple UINavigationBar.appearance().isTranslucent = false }
Use my extension iOS 13 Swift 5 tested extension UIViewController { func configureNavigationBar(largeTitleColor: UIColor, backgoundColor: UIColor, tintColor: UIColor, title: String, preferredLargeTitle: Bool) { if #available(iOS 13.0, *) { let navBarAppearance = UINavigationBarAppearance() navBarAppearance.configureWithOpaqueBackground() navBarAppearance.largeTitleTextAttributes = [.foregroundColor: largeTitleColor] navBarAppearance.titleTextAttributes = [.foregroundColor: largeTitleColor] navBarAppearance.backgroundColor = backgoundColor navigationController?.navigationBar.standardAppearance = navBarAppearance navigationController?.navigationBar.compactAppearance = navBarAppearance navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance navigationController?.navigationBar.prefersLargeTitles = preferredLargeTitle navigationController?.navigationBar.isTranslucent = false navigationController?.navigationBar.tintColor = tintColor navigationItem.title = title } else { // Fallback on earlier versions navigationController?.navigationBar.barTintColor = backgoundColor navigationController?.navigationBar.tintColor = tintColor navigationController?.navigationBar.isTranslucent = false navigationItem.title = title } }} How to use: configureNavigationBar(largeTitleColor: .yourColor, backgoundColor: .yourColor, tintColor: .yourColor, title: "yuorTitle", preferredLargeTitle: true) Set ViewController-based status bar...... to NO in info.plist if you want light Content If you don't want largeTitles set it to false for tranlsucent change navBarAppearance.configureWithOpaqueBackground() in: navBarAppearance.configureWithDefaultBackground() navigationController?.navigationBar.isTranslucent = true in the call set background color to .clear UPDATE: If you want to start with navigation controller and large Titles at first controller, don't forget to set launch controller in Scene Delegate like this: guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(windowScene: windowScene) window?.makeKeyAndVisible() let vC = UINavigationController(rootViewController: YourFirstViewController()) window?.rootViewController = vC hope this help :)
For full application navigation bar support please add this extension inside your code. import UIKit extension UIViewController { open func showNavigationBar(_ large: Bool, _ animated: Bool, titleColor: UIColor, barTintColor: UIColor, fontSize: CGFloat) { navigationController?.navigationBar.barTintColor = barTintColor navigationController?.navigationBar.backgroundColor = barTintColor navigationController?.navigationBar.isTranslucent = true self.navigationController?.setNavigationBarHidden(false, animated: animated) if large { self.navigationController?.navigationBar.prefersLargeTitles = true if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.backgroundColor = barTintColor appearance.titleTextAttributes = [.foregroundColor: titleColor] appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor, NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!] navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.compactAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance } else { self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor, NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!] } } else { self.navigationController?.navigationBar.prefersLargeTitles = false self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor, NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: 20.0)!] } } } And Then call this method simply self.showNavigationBar(true, true, titleColor: UIColor.blue, barTintColor: UIColor.red, fontSize: 32.0)
How to fix transparency of navigation bar in swift?
I have transparent navigation bar with a background image for view controller, But when I add a bar button item to navigation bar, it becomes like in the second picture. How do I have bar button items also fully transparent navigation bar. I used these code below to make the navigation bar transparent; 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 } }
This should create a transparent UINavigationBar with items in it. It's currently working fine for me. let navigationBarAppearace = UINavigationBar.appearance() navigationBarAppearace.tintColor = UIColor.whiteColor() navigationBarAppearace.translucent = true navigationBarAppearace.shadowImage = UIImage() navigationBarAppearace.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0) navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()] navigationBarAppearace.setBackgroundImage(UIImage(), forBarMetrics: .Default)
Try: if let navBar = self.navigationController?.navigationBar { extendedLayoutIncludesOpaqueBars = true navigationBar.translucent = true navigationBar.backgroundColor = UIColor.clearColor() navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) navigationBar.shadowImage = UIImage() }
Convert remove navigationBar border to swift
i'm trying to remove the navigationBar border in swift. This is done by using following code in objective-c: [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault] How can this be done in swift? i've tried this, but not working: UINavigationBar.appearance().shadowImage = UIImage(named: "") UINavigationBar.appearance().setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
Try this: UINavigationBar.appearance().shadowImage = UIImage() UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
To change the background, text and icons colors, and also remove the border/shadow of the navigation bar via the appearance proxy, insert this code in the didFinishLaunchingWithOptions: of AppDelegate: // our colors let backgroundColor = UIColor.blueColor() let foregroundColor = UIColor.whiteColor() // status bar text color (.LightContent = white, .Default = black) UIApplication.sharedApplication().statusBarStyle = .LightContent // solid or translucent background? UINavigationBar.appearance().translucent = false // remove bottom shadow UINavigationBar.appearance().shadowImage = UIImage() // background color UINavigationBar.appearance().setBackgroundImage(backgroundColor.toImage(), forBarMetrics: UIBarMetrics.Default) // controls and icons color UINavigationBar.appearance().tintColor = foregroundColor // text color UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: foregroundColor] Note: As you can see, we need to convert the UIColor to UIImage, so you can use this extension: extension UIColor{ func toImage() -> UIImage { let rect = CGRectMake(0, 0, 1, 1) UIGraphicsBeginImageContextWithOptions(rect.size, true, 0) self.setFill() UIRectFill(rect) var image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } } Use it like this: UIColor.redColor().toImage()
I have used the below code to remove the navigation bar shadow from the app. self.navigationController?.navigationBar.clipsToBounds = true
Changing navigation bar color in Swift
I am using a Picker View to allow the user to choose the colour theme for the entire app. I am planning on changing the colour of the navigation bar, background and possibly the tab bar (if that is possible). I've been researching how to do this but can't find any Swift examples. Could anyone please give me an example of the code I would need to use to change the navigation bar colour and navigation bar text colour? The Picker View is set up, I'm just looking for the code to change the UI colours.
Navigation Bar: navigationController?.navigationBar.barTintColor = UIColor.green Replace greenColor with whatever UIColor you want, you can use an RGB too if you prefer. Navigation Bar Text: navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.orange] Replace orangeColor with whatever color you like. Tab Bar: tabBarController?.tabBar.barTintColor = UIColor.brown Tab Bar Text: tabBarController?.tabBar.tintColor = UIColor.yellow On the last two, replace brownColor and yellowColor with the color of your choice.
Here are some very basic appearance customization that you can apply app wide: UINavigationBar.appearance().backgroundColor = UIColor.greenColor() UIBarButtonItem.appearance().tintColor = UIColor.magentaColor() //Since iOS 7.0 UITextAttributeTextColor was replaced by NSForegroundColorAttributeName UINavigationBar.appearance().titleTextAttributes = [UITextAttributeTextColor: UIColor.blueColor()] UITabBar.appearance().backgroundColor = UIColor.yellowColor(); Swift 5.4.2: UINavigationBar.appearance().backgroundColor = .green // backgorund color with gradient // or UINavigationBar.appearance().barTintColor = .green // solid color UIBarButtonItem.appearance().tintColor = .magenta UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.blue] UITabBar.appearance().barTintColor = .yellow More about UIAppearance API in Swift you can read here.
Updated for Swift 3, 4, 4.2, 5+ // setup navBar..... UINavigationBar.appearance().barTintColor = .black UINavigationBar.appearance().tintColor = .white UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] UINavigationBar.appearance().isTranslucent = false Swift 4 UINavigationBar.appearance().barTintColor = .black UINavigationBar.appearance().tintColor = .white UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white] UINavigationBar.appearance().isTranslucent = false Swift 4.2, 5+ UINavigationBar.appearance().barTintColor = .black UINavigationBar.appearance().tintColor = .white UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] UINavigationBar.appearance().isTranslucent = false if you want to work with large title, add this line: UINavigationBar.navigationBar.prefersLargeTitles = true Also can check here : https://github.com/hasnine/iOSUtilitiesSource
UINavigationBar.appearance().barTintColor = UIColor(red: 46.0/255.0, green: 14.0/255.0, blue: 74.0/255.0, alpha: 1.0) UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()] Just paste this line in didFinishLaunchingWithOptions in your code.
Within AppDelegate, this has globally changed the format of the NavBar and removes the bottom line/border (which is a problem area for most people) to give you what I think you and others are looking for: func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default) UINavigationBar.appearance().shadowImage = UIImage() UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().barTintColor = Style.SELECTED_COLOR UINavigationBar.appearance().translucent = false UINavigationBar.appearance().clipsToBounds = false UINavigationBar.appearance().backgroundColor = Style.SELECTED_COLOR UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] } Then you can setup a Constants.swift file, and contained is a Style struct with colors and fonts etc. You can then add a tableView/pickerView to any ViewController and use "availableThemes" array to allow user to change themeColor. The beautiful thing about this is you can use one reference throughout your whole app for each colour and it'll update based on the user's selected "Theme" and without one it defaults to theme1(): import Foundation import UIKit struct Style { static let availableThemes = ["Theme 1","Theme 2","Theme 3"] static func loadTheme(){ let defaults = NSUserDefaults.standardUserDefaults() if let name = defaults.stringForKey("Theme"){ // Select the Theme if name == availableThemes[0] { theme1() } if name == availableThemes[1] { theme2() } if name == availableThemes[2] { theme3() } }else{ defaults.setObject(availableThemes[0], forKey: "Theme") theme1() } } // Colors specific to theme - can include multiple colours here for each one static func theme1(){ static var SELECTED_COLOR = UIColor(red:70/255, green: 38/255, blue: 92/255, alpha: 1) } static func theme2(){ static var SELECTED_COLOR = UIColor(red:255/255, green: 255/255, blue: 255/255, alpha: 1) } static func theme3(){ static var SELECTED_COLOR = UIColor(red:90/255, green: 50/255, blue: 120/255, alpha: 1) } ...
To do this on storyboard (Interface Builder Inspector) With help of IBDesignable, we can add more options to Interface Builder Inspector for UINavigationController and tweak them on storyboard. First, add the following code to your project. #IBDesignable extension UINavigationController { #IBInspectable var barTintColor: UIColor? { set { guard let uiColor = newValue else { return } navigationBar.barTintColor = uiColor } get { guard let color = navigationBar.barTintColor else { return nil } return color } } } Then simply set the attributes for navigation controller on storyboard. This approach may also be used to manage the color of the navigation bar text from the storyboard: #IBInspectable var barTextColor: UIColor? { set { guard let uiColor = newValue else {return} navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: uiColor] } get { guard let textAttributes = navigationBar.titleTextAttributes else { return nil } return textAttributes[NSAttributedStringKey.foregroundColor] as? UIColor } }
Swift 4: Perfectly working code to change the navigation bar appearance at application level. // MARK: Navigation Bar Customisation // To change background colour. UINavigationBar.appearance().barTintColor = .init(red: 23.0/255, green: 197.0/255, blue: 157.0/255, alpha: 1.0) // To change colour of tappable items. UINavigationBar.appearance().tintColor = .white // To apply textAttributes to title i.e. colour, font etc. UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white, .font : UIFont.init(name: "AvenirNext-DemiBold", size: 22.0)!] // To control navigation bar's translucency. UINavigationBar.appearance().isTranslucent = false Happy Coding!
UINavigationBar.appearance().barTintColor worked for me
SWIFT 4 - Smooth transition (best solution): If you're moving back from a navigation controller and you have to set a diffrent color on the navigation controller you pushed from you want to use override func willMove(toParentViewController parent: UIViewController?) { navigationController?.navigationBar.barTintColor = .white navigationController?.navigationBar.tintColor = Constants.AppColor } instead of putting it in the viewWillAppear so the transition is cleaner. SWIFT 4.2 override func willMove(toParent parent: UIViewController?) { navigationController?.navigationBar.barTintColor = UIColor.black navigationController?.navigationBar.tintColor = UIColor.black }
Below Codes are working for iOS 15 if #available(iOS 15, *) { // Navigation Bar background color let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = UIColor.yourColor // setup title font color let titleAttribute = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25, weight: .bold), NSAttributedString.Key.foregroundColor: UIColor.yourColor] appearance.titleTextAttributes = titleAttribute navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance }
In Swift 4 You can change the color of navigation bar. Just use this below code snippet in viewDidLoad() Navigation Bar color self.navigationController?.navigationBar.barTintColor = UIColor.white Navigation Bar Text Color self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple] For iOS 11 Large Title Navigation Bar, you need to use largeTitleTextAttributes property self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]
The appearance() function not always work for me. So I prefer to create a NC object and change its attributes. var navBarColor = navigationController!.navigationBar navBarColor.barTintColor = UIColor(red: 255/255.0, green: 0/255.0, blue: 0/255.0, alpha: 100.0/100.0) navBarColor.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()] Also if you want to add an image instead of just text, that works as well var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 70, height: 70)) imageView.contentMode = .ScaleAspectFit var image = UIImage(named: "logo") imageView.image = image navigationItem.titleView = imageView
Swift 5 (iOS 14) Full navigation bar customization. // ----------------------------------------------------------- // NAVIGATION BAR CUSTOMIZATION // ----------------------------------------------------------- self.navigationController?.navigationBar.prefersLargeTitles = true self.navigationController?.navigationBar.tintColor = UIColor.white self.navigationController?.navigationBar.isTranslucent = false if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.configureWithDefaultBackground() appearance.backgroundColor = UIColor.blue appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance navigationController?.navigationBar.compactAppearance = appearance } else { self.navigationController?.navigationBar.barTintColor = UIColor.blue self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] } // ----------------------------------------------------------- // NAVIGATION BAR SHADOW // ----------------------------------------------------------- self.navigationController?.navigationBar.layer.masksToBounds = false self.navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 2) self.navigationController?.navigationBar.layer.shadowRadius = 15 self.navigationController?.navigationBar.layer.shadowOpacity = 0.7
Swift 5, an easy approach with UINavigationController extension. At the bottom of this answer are extensions and previews. First view controller (Home): override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.setTintColor(.white) navigationController?.backgroundColor(.orange) } Second view controller (Details): override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.transparentNavigationBar() navigationController?.setTintColor(.black) } Extensions for UINavigationController: extension UINavigationController { func transparentNavigationBar() { self.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationBar.shadowImage = UIImage() self.navigationBar.isTranslucent = true } func setTintColor(_ color: UIColor) { self.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: color] self.navigationBar.tintColor = color } func backgroundColor(_ color: UIColor) { navigationBar.setBackgroundImage(nil, for: .default) navigationBar.barTintColor = color navigationBar.shadowImage = UIImage() } } Storyboard view: Previews:
Use the appearance API, and barTintColor color. UINavigationBar.appearance().barTintColor = UIColor.greenColor()
In iOS 15, UIKit has extended the usage of the scrollEdgeAppearance, which by default produces a transparent background, to all navigation bars. Set scrollEdgeAppearance as below code. if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = < your tint color > navigationController?.navigationBar.standardAppearance = appearance; navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance }
This version also removes the 1px shadow line under the navigation bar: Swift 5: Put this in your AppDelegate didFinishLaunchingWithOptions UINavigationBar.appearance().barTintColor = UIColor.black UINavigationBar.appearance().tintColor = UIColor.white UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] UINavigationBar.appearance().isTranslucent = false UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .any, barMetrics: .default) UINavigationBar.appearance().shadowImage = UIImage()
iOS 8 (swift) let font: UIFont = UIFont(name: "fontName", size: 17) let color = UIColor.backColor() self.navigationController?.navigationBar.topItem?.backBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName: color], forState: .Normal)
If you have customized navigation controller, you can use above code snippet. So in my case, I've used as following code pieces. Swift 3.0, XCode 8.1 version navigationController.navigationBar.barTintColor = UIColor.green Navigation Bar Text: navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange] It is very helpful talks.
Swift 4, iOS 12 and Xcode 10 Update Just put one line inside viewDidLoad() navigationController?.navigationBar.barTintColor = UIColor.red
In Swift 2 For changing color in navigation bar, navigationController?.navigationBar.barTintColor = UIColor.whiteColor() For changing color in item navigation bar, navigationController?.navigationBar.tintColor = UIColor.blueColor() or navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blueColor()]
Swift 3 UINavigationBar.appearance().barTintColor = UIColor(colorLiteralRed: 51/255, green: 90/255, blue: 149/255, alpha: 1) This will set your navigation bar color like Facebook bar color :)
Swift 3 Simple one liner that you can use in ViewDidLoad() //Change Color self.navigationController?.navigationBar.barTintColor = UIColor.red //Change Text Color self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
Swift 3 and Swift 4 Compatible Xcode 9 A Better Solution for this to make a Class for common Navigation bars I have 5 Controllers and each controller title is changed to orange color. As each controller has 5 navigation controllers so i had to change every one color either from inspector or from code. So i made a class instead of changing every one Navigation bar from code i just assign this class and it worked on all 5 controller Code reuse Ability. You just have to assign this class to Each controller and thats it. import UIKit class NabigationBar: UINavigationBar { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonFeatures() } func commonFeatures() { self.backgroundColor = UIColor.white; UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor:ColorConstants.orangeTextColor] } }
If you're using iOS 13 or 14 and large title, and want to change navigation bar color, use following code: Refer to barTintColor not applied when NavigationBar is Large Titles fileprivate func setNavigtionBarItems() { if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.configureWithDefaultBackground() appearance.backgroundColor = .brown // let naviFont = UIFont(name: "Chalkduster", size: 30) ?? .systemFont(ofSize: 30) // appearance.titleTextAttributes = [NSAttributedString.Key.font: naviFont] navigationController?.navigationBar.prefersLargeTitles = true navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance //navigationController?.navigationBar.compactAppearance = appearance } else { // Fallback on earlier versions navigationController?.navigationBar.barTintColor = .brown } } This took me 1 hour to figure out what is wrong in my code:(, since I'm using large title, it is hard to change the tintColor with largeTitle, why apple makes it so complicated, so many lines to just make a tintColor of navigationBar.
iOs 14+ init() { let appearance = UINavigationBarAppearance() appearance.shadowColor = .clear // gets also rid of the bottom border of the navigation bar appearance.configureWithTransparentBackground() UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }
iOS 10 Swift 3.0 If you don't mind to use swift frameworks then us UINeraida to change navigation background as UIColor or HexColor or UIImage and change navigation back button text programmatically, change complete forground text color. For UINavigationBar neraida.navigation.background.color.hexColor("54ad00", isTranslucent: false, viewController: self) //Change navigation title, backbutton colour neraida.navigation.foreground.color.uiColor(UIColor.white, viewController: self) //Change navigation back button title programmatically neraida.navigation.foreground.backButtonTitle("Custom Title", ViewController: self) //Apply Background Image to the UINavigationBar neraida.navigation.background.image("background", edge: (0,0,0,0), barMetrics: .default, isTranslucent: false, viewController: self)
I had to do UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().barStyle = .Black UINavigationBar.appearance().backgroundColor = UIColor.blueColor() otherwise the background color wouldn't change
First set the isTranslucent property of navigationBar to false to get the desired colour. Then change the navigationBar colour like this: #IBOutlet var NavigationBar: UINavigationBar! NavigationBar.isTranslucent = false NavigationBar.barTintColor = UIColor (red: 117/255, green: 23/255, blue: 49/255, alpha: 1.0)
Make sure to set the Button State for .normal extension UINavigationBar { func makeContent(color: UIColor) { let attributes: [NSAttributedString.Key: Any]? = [.foregroundColor: color] self.titleTextAttributes = attributes self.topItem?.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) self.topItem?.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal) } } P.S iOS 12, Xcode 10.1