我有一个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
导航栏高度状态栏高度和标签栏高度始终保持不变:
- 导航栏- 44页
- 状态栏- 20pts
- 标签栏- 49点。
你可以直接从视图高度中减去这些常数:self.view.frame.size.height (44 + 20 + 49)