Search code examples
heightswiftuinavigationbar

SwiftUI NavigationBar height


How to get current NavigationBar height? In UIKit we could get

navigationController?.navigationBar.frame.height

but can't find anything for SwiftUI...


Solution

  • Based on this post (thanks to Asperi): https://stackoverflow.com/a/59972635/12299030

    struct NavBarAccessor: UIViewControllerRepresentable {
        var callback: (UINavigationBar) -> Void
        private let proxyController = ViewController()
    
        func makeUIViewController(context: UIViewControllerRepresentableContext<NavBarAccessor>) ->
                                  UIViewController {
            proxyController.callback = callback
            return proxyController
        }
    
        func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavBarAccessor>) {
        }
    
        typealias UIViewControllerType = UIViewController
    
        private class ViewController: UIViewController {
            var callback: (UINavigationBar) -> Void = { _ in }
    
            override func viewWillAppear(_ animated: Bool) {
                super.viewWillAppear(animated)
                if let navBar = self.navigationController {
                    self.callback(navBar.navigationBar)
                }
            }
        }
    }
    

    And then we can call this from any View:

    .background(NavBarAccessor { navBar in
          print(">> NavBar height: \(navBar.bounds.height)")
                    // !! use as needed, in calculations, @State, etc.
     })