我有一个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)?还是有另一种更明显的方式来集中视图?感谢。
(我试图发布截图以便更好地理解,但我错过了发布图片所需的声望点,抱歉)
答案 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)
导航栏高度状态栏高度和标签栏高度始终保持不变:
您可以直接从视图高度中减去这些常量: self.view.frame.size.height-(44 + 20 + 49)