UITableViewCell边距不一致(静态单元格)

时间:2018-08-16 18:52:57

标签: ios autolayout iphone-x

我遇到了一个有趣的问题,即不同设备之间的边距不一致。这是分别来自具有相同iOS(11.4.1)和运行相同应用程序的iPhone X和iPhone 6+的2个屏幕截图。

margin inconsistency

您可以看到,iPhone X上的所有内容均正确对齐(以及IB中的对齐),但iPhone 6+上存在4像素不一致的情况。

这是带有静态单元格的表格视图。除第二个菜单项(“脱机模式”)处于具有自定义约束的自定义样式外,所有菜单项均为基本样式。在基本样式中,UILabel具有X = 16。我的自定义约束还具有一个恒定值16。

当然,我可以将自定义约束更改为20,但是情况会发生变化。因此,在iPhone 6+上,它们将全部正确对齐,但在iPhone X上将未对齐。

我试图找出这4个像素来自何处,但一无所获。请帮忙。

3 个答案:

答案 0 :(得分:2)

问题是,您已将标签的前沿固定到常数为16的内容视图的 edge 上。这不是其他单元格的工作方式,因此您将获得不同的结果。 / p>

相反,将标签的前缘固定为内容视图的左边缘,常数为0。在较小的设备上,左边距为16;在较大的设备上,左边距为20。正是您在其他单元格上看到的差异(因为这正是它们的配置方式)。

答案 1 :(得分:0)

通常,一旦您开始需要控制表格视图单元格的边距等,您最好的选择就是将内置的东西留在后面,并创建具有显式约束和子视图的自定义UITableViewCell子类。

在这种特殊情况下,屏幕宽度是不同的,并且基本像元类型会计算其相对于屏幕宽度的边距约束。如果您从右边看,您会发现开关控件相对于其他单元格中的显示指示器的位置存在相同的不一致。

(编辑:最简单的解决方案是根据暗淡的建议,具体取决于您的目标,将其固定在内容视图的边缘,而不是实际的边缘。)

如果需要,可以在自定义单元格上调整自己的约束,以使其不是恒定的而是相对的。您可以通过查看几个different device screen sizes来确定它是否恒定(例如iPhone 6,SE等),从而找出所需的乘数。但是从长远来看,使用自己的子类可能更实用。请注意,您通常确实希望对此类事情使用相对约束,因为您的固定边距在一个屏幕尺寸上可能看起来不错,但在另一屏幕尺寸上却很奇怪。

这不是理想的选择,但从技术上讲,您还可以检查用户使用的设备(或视图的宽度),并使用开关返回适当的约束。虽然,如果您真的只关心iPhone X和6+,那么您可能要考虑这样做。

您可能还想考虑使用类似Eureka的表单库,但是类似的东西有一些学习曲线,尤其是在自定义单元格及其子视图的外观时。

答案 2 :(得分:0)

马特的答案是正确的。我只想添加更多细节,因为这可能对其他人有益。因此,事实证明,我要做的就是在IB的约束属性中选中以下复选框:

enter image description here

当您知道要查找的位置时,看起来非常简单。