获取框架高度,而不需要导航栏高度和更深层视图层次中的标签栏高度



我有一个ViewController (B),它是由另一个ViewController (a)内部的PageViewController处理的,并打开它的模态。我把ViewController (B)正好放在屏幕的中间。

但是当我从NavigationController推送ViewController (A)时,ViewController (B)的框架是大的,并扩展到NavigationBar和TabBar下面。但是我想让它在导航栏和标签栏中间

我知道如何获得导航栏和选项栏的高度,这样我就可以调整ViewController (B)的大小:

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

但是这在ViewController (B). self的层次结构中不起作用。navigationController和self。tabBarController都是nil。我怎样才能得到视图层次结构中导航栏和制表栏的高度呢?或者我只需要传递它从一个视图控制器到另一个,直到我到达ViewController (B)?或者有没有其他更明显的方式来居中?谢谢。

(我曾试图发布截图,以更好地理解,但我错过了发布图像所需的声誉点,对不起)

使用

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

支持纵向和横向状态。

迅速5

let height = UIApplication.shared.statusBarFrame.height +
      self.navigationController!.navigationBar.frame.height

对于UITabBar,这段代码可以工作:

self.tabBarController?.tabBar.frame.height

迅速 3

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

对于iOS 13,由于UIApplication对象的statusBarFrame属性已弃用,因此可以使用:

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

现在,它似乎没有帮助你@OP,因为你的navigationController是nil,但你可以尝试使用view.window?.windowScene?.statusBarManager?.statusBarFrame.height为状态栏的高度,并找出一种方法来找到导航栏的高度,以及?希望有帮助

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 in viewController

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

  1. 导航栏- 44页
  2. 状态栏- 20pts
  3. 标签栏- 49点。

你可以直接从视图高度中减去这些常数:self.view.frame.size.height (44 + 20 + 49)

最新更新