Programmatically get height of navigation bar

前端 未结 14 1034
猫巷女王i
猫巷女王i 2020-12-04 08:02

I know that the presence of the more view controller (navigation bar) pushes down the UIView by its height. I also know that this height = 44px. I have also discovered tha

相关标签:
14条回答
  • 2020-12-04 08:40

    I have used:

    let originY: CGFloat = self.navigationController!.navigationBar.frame.maxY
    

    Working great if you want to get the navigation bar height AND its Y origin.

    0 讨论(0)
  • 2020-12-04 08:43

    Support iOS 13 and Below:

    extension UIViewController {
    
        var topbarHeight: CGFloat {
            if #available(iOS 13.0, *) {
                return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
                    (self.navigationController?.navigationBar.frame.height ?? 0.0)
            } else {
                let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
                (self.navigationController?.navigationBar.frame.height ?? 0.0)
                return topBarHeight
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 08:43

    Here is the beginning of my response to your update:

    Why does the content height of my UIWebView not change with rotation?.

    Could it be that because your auto resize doesn't have the autoresizingMask for all directions?

    Another suggestion before I come back for this, could you use a toolbar for your needs. It's a little simpler, will always be on the bottom, auto-rotates/positions. You can hide/show it at will etc. Kind of like this: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

    You may have looked at that option, but just throwing it out there.

    Another idea, could you possibly detect what orientation you are rotating from, and just place the button programmatically to adjust for the tab bar. (This is possible with code)

    0 讨论(0)
  • 2020-12-04 08:45

    Swift 5

    If you want o consider the safeArea as well:

     let height = navigationController?.navigationBar.frame.maxY  
    
    0 讨论(0)
  • 2020-12-04 08:46

    With iPhone-X, height of top bar (navigation bar + status bar) is changed (increased).

    Try this if you want exact height of top bar (both navigation bar + status bar):

    UPDATE

    iOS 13

    As the statusBarFrame was deprecated in iOS13 you can use this:

    extension UIViewController {
    
        /**
         *  Height of status bar + navigation bar (if navigation bar exist)
         */
    
        var topbarHeight: CGFloat {
            return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
                (self.navigationController?.navigationBar.frame.height ?? 0.0)
        }
    }
    

    Objective-C

    CGFloat topbarHeight = ([UIApplication sharedApplication].statusBarFrame.size.height +
           (self.navigationController.navigationBar.frame.size.height ?: 0.0));
    

    Swift 4

    let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    

    For ease, try this UIViewController extension

    extension UIViewController {
    
        /**
         *  Height of status bar + navigation bar (if navigation bar exist)
         */
    
        var topbarHeight: CGFloat {
            return UIApplication.shared.statusBarFrame.size.height +
                (self.navigationController?.navigationBar.frame.height ?? 0.0)
        }
    }
    

    Swift 3

    let topBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height +
    (self.navigationController?.navigationBar.frame.height ?? 0.0)
    

    0 讨论(0)
  • 2020-12-04 08:52

    iOS 14

    For me, view.window is null on iOS 14.

    extension UIViewController {
        var topBarHeight: CGFloat {
            var top = self.navigationController?.navigationBar.frame.height ?? 0.0
            if #available(iOS 13.0, *) {
                top += UIApplication.shared.windows.first?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
            } else {
                top += UIApplication.shared.statusBarFrame.height
            }
            return top
        }
    }
    
    0 讨论(0)
提交回复
热议问题