iOS 12错误的导航栏高度

iOS 12错误的导航栏高度,ios,uinavigationbar,Ios,Uinavigationbar,我正在开发一款面向横向的iPad应用程序。顶部有一个导航栏,没有状态栏,我想排列一个UITableView,以便表格顶部与导航栏底部的y坐标相同。当然,我会在viewDidLoad中执行以下操作: MyTableView* table = [[MyTableView alloc] init]; table.frame = CGRectMake(someX, navBar.frame.size.height, someWidth, someHeight); [self.view addSubvie

我正在开发一款面向横向的iPad应用程序。顶部有一个导航栏,没有状态栏,我想排列一个
UITableView
,以便表格顶部与导航栏底部的y坐标相同。当然,我会在
viewDidLoad
中执行以下操作:

MyTableView* table = [[MyTableView alloc] init];
table.frame = CGRectMake(someX, navBar.frame.size.height, someWidth, someHeight);
[self.view addSubview:table];
此时,
navBar.frame.size.height
返回44。这很奇怪,因为当我运行应用程序时,我看到我的表格与导航栏底部重叠了几个点。我做了一些调查,发现导航栏实际上是以50点的高度绘制的

我试着思考可能出现的错误,并意识到可能我在视图控制器的生命周期中做得太早了,视图还没有布置好,所以我覆盖了
viewwillbeen
viewdidebeen
,和
viewdidelayoutsubviews
,所有这些都报告导航栏的高度是44,即使它的高度明显为50

我想可能有什么我根本不知道的,所以我设置了一个计时器来运行一段代码,在调用
viewDidLoad
后,每隔一秒重复打印导航栏的高度,这允许任何幕后的视图控制器完成设置。不过,每次计时器触发打印时,高度仅为44

我查看了interface builder,甚至在那里,在dimensions属性窗口(右起第二个选项卡)中,它显示导航栏的高度为44。然而在interface builder中视图控制器的屏幕上,它的高度显然是50

我的问题是:为什么报告的高度与导航栏绘制的高度不匹配?我需要正确的高度才能将我的桌子放在正确的位置

在这一点上,除了API完全被破坏之外,我对可能出现的问题一无所知。我能想到的唯一解决方案是将导航栏定位在-3,并将我的表视图的y值硬编码为44,这样会导致导航栏顶部和底部的3个点被覆盖,这是非常令人讨厌的,我希望尽可能避免

现在,我明白了autolayout是一个存在约束的东西,但我喜欢在代码中手动计算视图的框架,从不使用约束,这就是这个问题所在的领域。请不要给出像“你应该使用约束”这样的答案

尽管我怀疑这有什么关系,但我正在iPad Air 2上运行iOS 12.0.1


我的调试:

下面是我的屏幕顶部中间部分的图像。每个矩形都只是一个
ui视图
,具有背景色集、y坐标为0、宽度为50点,彼此间隔50点(每个从前一个结束的地方开始)。每个矩形从左到右的高度分别为:44、50和51。可以看出导航栏的绘制高度为50点,因为右侧矩形仅略高于导航栏


编辑:

我可能应该提到,这个导航栏是通过拖放到情节提要中的视图控制器中添加到视图控制器的。我仍然在
viewDidLoad
中进行一些框架设计,但它并没有被动态添加到视图中

另一件有趣的事情是:在interface builder中,您知道蓝色虚线可以帮助您排列东西吗?显然,它们与44点高度对齐,而不是50点高度:


在花了太多时间却毫无进展之后,我决定最终咬紧牙关,转向约束。在我花了太多时间试图让他们做我想做的事情(但失败了)之后,结果证明,手动列出我的观点并不是问题所在。在转换过程中,我删除了我的导航栏,并将其重新添加到视图控制器中,这使得一切都开始完美工作。蓝色虚线对齐参考线与50点高度对齐,“高度”字段现在始终返回50


我的猜测是,Xcode中将情节提要从iOS 12之前的导航栏(44点高)升级到新的iOS 12导航栏(50点高)的逻辑被打破了,这使我的情节提要进入了一个糟糕的状态,它认为某些地方的高度是44,而另一些地方的高度是50。删除并重新添加它看起来已经清除了任何44 ness的记录,所以现在所有东西都正确地高出了50点。

当开发人员开始担心系统导航栏/选项卡栏的高度时,总会有一些东西出轨——我真的很喜欢你对你不想看到的答案的期望,但是撇开你对
44!=50 != 51
,我不明白为什么这个高度与你有关,或者你的问题到底是什么,或者为什么你认为这个高度在任何方面都是错误的。@holex我的问题是,为什么从
navBar.frame.size.height
(44)返回的高度与它在屏幕上绘制的高度(50)不匹配?高度是相关的,因此我可以将桌子放在正确的y坐标上。如果
navBar
告诉我一个与它所绘制的高度不同的高度,那么我的桌子的位置将是错误的——要么太高,要么太低。我认为高度不对,因为它与显示的高度不匹配。唯一的另一种选择是它使用错误的高度绘制,但这似乎比简单地返回错误的高度更不可能。我知道你说过你不想看到“你应该使用约束”,但你应该使用约束。你必须有一个地狱般的用例,而你在这里概述的任何东西都不能表明你有这样一个用例。苹果有多少次告诉你不要手动布局?