我正在横向使用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
,{{ 1}}和viewDidAppear
,它们都报告导航栏的高度为44,即使它清楚地以50的高度绘制。
我认为也许有些我根本不知道的东西,所以我设置了一个计时器来运行一段代码,该代码块将在调用viewDidLayoutSubviews
之后每秒每秒重复打印出导航栏的高度,这样可以完成所有视图控制器的幕后设置。尽管如此,每次计时器触发打印时,高度仅为44。
我看了一下界面构建器,甚至在那里,在Dimensions属性窗口(右边第二个选项卡)中,导航栏的高度为44。但是在界面构建器的视图控制器的屏幕上,显然是高度为50的绘图。
我的问题是:为什么报告的高度与导航栏绘制的高度不匹配?我需要正确的高度才能将桌子放在正确的位置。
在这一点上,我不知所措,可能是因为API完全被破坏了。我能想到的唯一解决方案是将导航栏定位在-3处,并以44的表视图的y值硬编码,从而导致导航栏顶部和底部的3个点被遮盖,这是超级麻烦的我想尽可能避免它。
现在,我知道自动布局是存在的事情,并且存在约束,但是我喜欢手动在代码中计算视图的框架,并且从不使用约束,这就是这个问题所在的领域。请不要给出诸如“您应该使用约束”之类的答案。
尽管我怀疑这很重要,但是我正在iPad Air 2上运行iOS 12.0.1。
我的调试:
下面是屏幕顶部中间部分的图像。每个矩形只是一个viewDidLoad
,背景颜色设置为,y坐标为0,宽度为50个点,并且彼此间隔50个点(每个点在上一个结束处开始)。每个矩形从左到右的高度分别是:44、50和51。您可以看出导航栏的绘制高度为50点,因为右矩形刚好比导航栏高。
编辑:
我可能应该提到,该导航栏是通过拖放到情节提要中的视图控制器中而添加到视图控制器中的。我仍然在UIView
中进行一些框架设计,但是并没有动态地添加到那里的视图中。
另一个值得注意的事情:在界面生成器中,您知道蓝色虚线帮助您进行排列吗?显然,它们与44点高度而不是50点高度对齐:
答案 0 :(得分:0)
在花了太多时间没有进展之后,我决定终于硬着头皮过渡到束缚。在我花了太多时间试图让他们做我想做的(失败)之后,事实证明,手动布置我的观点不是问题。在转换过程中,我删除了导航栏,然后将其重新添加到视图控制器中,这使一切开始正常运行。虚线的蓝色对齐参考线与50点高度对齐,并且高度字段现在始终返回50。
我的猜测是Xcode中将故事板从iOS 12之前的导航栏(高44点)升级到新的iOS 12导航栏(高50点)的逻辑被破坏了,这使我的故事板处于一种糟糕的状态以为某些地方的高度是44,其他地方的高度是50。删除并重新添加它似乎已经清除了所有44度记录,因此现在所有内容都正确地高了50点。