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

UITableViewCell margin inconsistency (Static cells)

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

您可以看到在 iPhone X 上一切都正确对齐(在 IB 中也是如此),但在 iPhone 6+ 上有 4 个像素的不一致。

这是一个包含静态单元格的 table 视图。所有菜单项都是基本样式,除了第二个 ("Offline mode") 是带有自定义约束的自定义样式。在基本样式中,UILabel 的 X=16。我的自定义约束也有一个常量值 16。

当然,我可以将我的自定义约束更改为 20,但情况会发生逆转。所以在 iPhone 6+ 上它会全部正确对齐,但在 iPhone X.

上会错位

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

通常,一旦您开始需要控制 table 视图单元格的边距等,您最好的选择就是留下内置的东西,并制作具有明确约束的自定义 UITableViewCell 子类,并且子视图。

在这种特殊情况下,屏幕宽度不同,基本单元格类型计算其相对于屏幕宽度的边距限制。如果您查看右侧,您会看到开关控件相对于其他单元格中的披露指示器的定位存在同样的不一致。

(编辑:最简单的解决方案,取决于您的目标,正如马特建议的那样,固定到内容视图的边距而不是实际边缘。)

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

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

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

问题是您已将标签的前缘固定到内容视图的 edge,常数为 16。这不是其他单元格的工作方式,所以您得到不同的结果。

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

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

当您知道在哪里寻找时,看起来很简单。