【发布时间】:2018-11-21 03:05:38
【问题描述】:
我正在开发一个横向的 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 磅的高度绘制的。
我试着思考可能出了什么问题,并意识到我可能在视图控制器的生命周期中这样做得太早并且视图尚未布局,所以我覆盖了viewWillAppear、viewDidAppear、和viewDidLayoutSubviews,它们都报告导航栏的高度是44,即使它清楚地以50的高度绘制。
我想也许有一些我根本不知道的东西,所以我设置了一个计时器来运行一段代码,在调用 viewDidLoad 后每秒重复打印出导航栏的高度,这允许任何查看控制器幕后设置以完成。尽管如此,每次定时器触发打印时,高度只有 44。
我查看了界面生成器,甚至在那里,在尺寸属性窗口(右起第二个选项卡)中,它说导航栏的高度为 44。然而在界面生成器的视图控制器的屏幕上,它显然是在高度为 50 的情况下绘制的。
我的问题是:为什么报告的高度与导航栏绘制的高度不匹配?我需要正确的高度才能将我的桌子放在正确的位置。
在这一点上,我不知道可能是什么问题,除了 API 完全被破坏了。我能想到的唯一解决方案是将导航栏定位在 -3 并将我的表格视图 44 的 y 值硬编码,导致导航栏顶部和底部的 3 个点被覆盖,这是超级 janky如果可能的话,我想避免它。
现在,我知道自动布局是一个东西并且存在约束,但我喜欢在代码中手动计算我的视图框架并且从不使用约束,这就是这个问题所在的领域。请不要给出像“你应该使用约束”这样的答案。
虽然我怀疑这是否重要,但我在 iPad Air 2 上运行 iOS 12.0.1。
我的调试:
下面是我的屏幕顶部中心部分的图像。每个矩形只是一个UIView,设置了背景颜色,y 坐标为 0,宽度为 50 点,彼此相距 50 点(每个矩形从前一个矩形结束的位置开始)。每个矩形从左到右的高度分别为:44、50 和 51。您可以看出导航栏的绘制高度为 50 磅,因为右侧矩形仅略高于导航栏。
编辑:
我应该提到这个导航栏是通过拖放到故事板中的视图控制器中添加到视图控制器中的。我仍然在viewDidLoad 中做一些框架恶作剧,但它并没有被动态添加到那里的视图中。
另一个有趣的事情是:在界面生成器中,您知道帮助您排列事物的蓝色虚线吗?显然,那些与 44 点高度而不是 50 点高度对齐:
【问题讨论】:
-
当开发者开始担心系统导航栏/标签栏的高度时,总会有一些事情发生了绝望的脱轨——我真的很喜欢你对你做什么样的回答的期望不想想看,但除了你对
44 != 50 != 51的鹰眼观察之外,我不明白为什么这个 height 与你相关,或者你的问题到底是什么,或者为什么你会认为 height 在任何方面都是错误的。 -
@holex 我的问题是为什么从
navBar.frame.size.height(44) 返回的高度与它在屏幕上绘制的高度(50) 不匹配?高度是相关的,因此我可以将我的桌子放在正确的 y 坐标上。如果navBar告诉我的高度与它所绘制的高度不同,那么我的桌子的位置将是错误的——太高或太低。我认为高度是错误的,因为它与显示的高度不匹配。唯一的其他选择是它使用错误的高度进行绘制,但这似乎比简单地返回错误的高度更不可能。 -
我知道你说过你不想看到“你应该使用约束”,但你应该使用约束。你必须有一个用例 not 的地狱,而且你在这里概述的任何内容都没有表明你有这样一个用例。 Apple 必须告诉你多少次不要手动布局?
标签: ios uinavigationbar