在更深的视图层次结构中获取没有导航栏高度和标签栏高度的框架高度

时间:2015-05-28 09:59:08

标签: ios objective-c swift uinavigationcontroller uitabbarcontroller

我有一个ViewController(B),它由一个PageViewController处理,它位于另一个ViewController(A)中并打开它模态。我将ViewController(B)完全置于屏幕中间。这很好。

但是当我从NavigationController推送ViewController(A)时,ViewController(B)的框架变大并延伸到NavigationBar和TabBar下面。但我希望它集中在NavigationBar和TabBar之间。

我知道如何获得导航栏和标签栏的高度,以便我可以调整ViewController(B)的大小:

var topBar = self.navigationController?.navigationBar.frame.height
var bottomBar = self.tabBarController?.tabBar.frame.height

但是这在ViewController(B)的vier层次结构中不起作用。 self.navigationController和self.tabBarController都是nil。那么如何在视图层次结构中更深入地获取导航栏和标签栏的高度?或者我只需要将它从一个ViewController传递到另一个ViewController,直到我到达ViewController(B)?还是有另一种更明显的方式来集中视图?感谢。

(我试图发布截图以便更好地理解,但我错过了发布图片所需的声望点,抱歉)

6 个答案:

答案 0 :(得分:33)

使用此:

let height = UIApplication.sharedApplication().statusBarFrame.height +
self.navigationController!.navigationBar.frame.height

这支持肖像和风景状态。

答案 1 :(得分:6)

对于UITabBar,此代码有效:

self.tabBarController?.tabBar.frame.height

答案 2 :(得分:0)

Swift 3

navBarHeight = (self.navigationController?.navigationBar.intrinsicContentSize.height)! 
+ UIApplication.shared.statusBarFrame.height

答案 3 :(得分:0)

对于 iOS 13 ,由于不推荐使用UIApplication对象的statusBarFrame属性,因此可以使用:

let statusBarHeight =  navigationController?.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

let navigationBarHeight = navigationController?.navigationBar.frame.height ?? 0

现在,由于您的navigationController为nil,似乎对@OP没有帮助,但是您可以尝试使用view.window?.windowScene?.statusBarManager?.statusBarFrame.height作为statusBar的高度,并想出一种找到navBar高度的方法吗?希望能有所帮助:)

答案 4 :(得分:0)

iOS 13解决方案:

extension UIViewController {

    /**
     *  Height of status bar + navigation bar (if navigation bar exist)
     */

    var topbarHeight: CGFloat {

        let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

        return (window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0) +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

要调用它,您可以使用self.topbarHeight中的viewController

答案 5 :(得分:-17)

导航栏高度状态栏高度和标签栏高度始终保持不变:

  1. 导航栏 - 44pts
  2. 状态栏 - 20pts
  3. 标签栏 - 49pts。
  4. 您可以直接从视图高度中减去这些常量: self.view.frame.size.height-(44 + 20 + 49)