TechChain
TechChain

Reputation: 8944

Navigation bar appear from black color?

I am setting a new navigation for my app on launch. But when I launch it appears from a black color animation.After black color it sets it navigation bar. Please tell me what is issue.

I am using below code

var controller = UIViewController()

//App Theming
var navController = UINavigationController()
navController.navigationBar.barTintColor = UIColor.white
navController.navigationBar.tintColor = UIColor.white
navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
navController.navigationBar.shadowImage = UIImage()

navController.navigationBar.setBackgroundImage(UIImage(), for: .default)
navController.navigationBar.isTranslucent = false
navController = UINavigationController(rootViewController: viewcontroller)
navController.navigationBar.isHidden = true

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = navController
appDelegate.window?.makeKeyAndVisible()

Upvotes: 2

Views: 2277

Answers (5)

LLIAJLbHOu
LLIAJLbHOu

Reputation: 1313

Your code should be placed in

import UIKit

// AppDelegate class file

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Be attentive. controller allocated withou any layout. Change to custom controller class or load from IB resource (storyboard/nib)
    let controller = UIViewController()
    let navigationController = rootNavigationController
    // Setup viewControllers. Just one controller as root
    navigationController.viewControllers = [controller]
    // You already have a reference to window in your AppDelegate
    window.rootViewController = navigationController
    window.makeKeyAndVisible()
}

extension AppDelegate {

    // Move out of AppDelegate class code to create theming NavigationController
    private var rootNavigationController: UINavigationController {
        let navController = UINavigationController()
        navController.navigationBar.barTintColor = UIColor.white
        navController.navigationBar.tintColor = UIColor.white
        navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
        navController.navigationBar.shadowImage = UIImage()
        navController.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navController.navigationBar.isTranslucent = false
        navController.navigationBar.isHidden = true
        // If it theme for all application you should use appearances
        /* For Example
        UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
        UINavigationBar.appearance().tintColor = .white
        */

        return navController
    }

}

You possible errors:

  • controller instance haven't any layout. By default ViewController haven't anything
  • You code call from separated place. It's market by you call of AppDelegate instance. Configure you rootViewController in didFinishLoading
  • You have an separated ViewController that placed as root

Upvotes: 0

Sanad Barjawi
Sanad Barjawi

Reputation: 578

alright i just noticed you're using storyboards, give this a try:

var storyboard = UIStoryboard(name: "Main", bundle: nil)
var ivc = storyboard.instantiateViewController(withIdentifier: "ViewController") as? ViewController
navigationController?.pushViewController(anIvc, animated: true)
window.rootViewController = ivc
window.rootViewController = navigationController
window.makeKeyAndVisible()

Upvotes: 0

Sanad Barjawi
Sanad Barjawi

Reputation: 578

  • I can see that you did not give the navigationController any viewControllers.
  • You need to pass the navigation controller at least one viewController for it to know which viewController to start your navigation process from, follow the code below:

    var window: UIWindow? let nav = UINavigationController()

1- here is where i declared my Initial viewController (where i want my navigation process to start from)

var  main = HomeViewController(nibName: "HomeViewController", bundle: nil)

2- here is where i give the navigationController the first viewController to start from.

    window?.rootViewController = nav
    nav.viewControllers = [main]//you need to have this line
    nav.isNavigationBarHidden = true
    window?.makeKeyAndVisible()

Upvotes: 0

Rizwan Mehboob
Rizwan Mehboob

Reputation: 1373

Please use snippet bellow

In this I am using ViewController from Main storyboard

   // mainStoryboard
        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)

        // rootViewController
        let rootViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as? ViewController

        // navigationController
        let navigationController = UINavigationController(rootViewController: rootViewController!)

        //App Theming
        navigationController.navigationBar.barTintColor = UIColor.white
        navigationController.navigationBar.tintColor = UIColor.white
        navigationController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
        navigationController.title = "Testing Th"
        navigationController.navigationBar.shadowImage = UIImage()


        navigationController.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController.navigationBar.isTranslucent = false
        navigationController.navigationBar.isHidden = true
        // self.window
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window!.rootViewController = navigationController
        self.window!.makeKeyAndVisible()

If I unhide NavigationBar

    navigationController.navigationBar.isHidden = false

you can clearly see the results enter image description here

Upvotes: 3

Kevinosaurio
Kevinosaurio

Reputation: 2010

The problem is this line:

navController.navigationBar.isHidden = true

Delete it and try again.

Upvotes: 4

Related Questions