XCode 6.3 如何给 UITableView 的单元格添加边距

8
XCode 6.3 / Swift 1.2是否给UITableViewCell的contentView添加了额外的边距?在更新之前,我的自定义UIView在单元格中横跨整个屏幕。例如:
现在,单元格中的所有内容似乎都有额外的边距,我不知道它们来自哪里。
请注意,这些视图的宽度在代码中没有任何改变,并且右侧和左侧被约束如下:
还要注意,我正在使用tableView.separatorStyle = .None。我提到这个事实是因为由于某种原因,在其中一个具有默认分隔符的tableView中,它似乎没有添加这些额外的边距。
有人知道他们是否在XCode 6.3中做了一些奇怪的更改吗?此行为发生在更新后直接发生。
编辑:

我在更新之前在iOS 8上运行这个应用程序,它看起来像第一张截图。 - ad121
我不知道还能添加什么。我只是使用每边-16的约束进行了测试,它可以正确地扩展到整个屏幕,但我不知道为什么我的边距会被推开(我不想在不知道原因的情况下使用临时解决方法)。我打印了contentView、view、tableView和cell本身的宽度,它们在iPhone 6上都是375,但是根据问题中给出的约束,蓝色块的宽度为359。 - ad121
但是你为什么一开始就将约束条件设置为边缘呢?将它们设置为内容视图的实际边缘,然后边距的更改就不会影响你了。我意识到这并没有回答根本问题,但是假设边距为8并将约束条件设置为-8来进行补偿,这种做法一开始就很疯狂。 - matt
这在界面构建器中可行吗?我只是在故事板中将其限制为contentview。我放了一张图片在主贴中展示。 - ad121
1个回答

19
仔细观察此领先约束的大小检查器的屏幕截图:
请注意,“相对于边距”被选中了吗?这就是问题所在。取消勾选该菜单项,然后将常数更改为零。对于尾随约束也要这样做,你的问题就解决了。
现在让我们解决更深层次的问题:发生了什么变化?你完全正确,确实有一些变化。我认为他们修复了一个错误,你陷入了修复中。日志显示,单元格的preservesSuperviewLayoutMargins是true,表的边距是0,16,0,16。即使在iOS 8.2上也是如此,因此iOS 8.2上的有效边距应该是16。但它们是8,就像preservesSuperviewLayoutMargins为false一样。但在iOS 8.3中,这个设置会被正确地执行,从而产生你观察到的结果。
因此,另一种解决问题的方法是保留现有的约束,但在cellForRowAtIndexPath中将每个单元格的preservesSuperviewLayoutMargins设置为false。这样同样可以使两个系统的结果相同。
编辑好消息:看起来在iOS 9中已经恢复了这个更改。因此,如果没有更改,您的单元格在iOS 9中将与iOS 8.2和之前的版本相同。

编辑以解释基础现象:你是绝对正确的,边距确实发生了变化!非常感谢你指出来。 - matt
好的,那真是一次令人印象深刻的调试!我不得不检查所有表格视图单元格的约束条件。这修复了它们中的所有问题。谢谢。 - nmdias
你真的被苹果的新基于边距的约束所困扰。当你使用控件拖动初始形成约束时,它将会是基于边距的,除非你按住 Option 键以获得非基于边距的变量。因此,基于边距的约束是一项选择退出的技术;你可以选择退出,但大多数人不会知道如何做到这一点,最终会在不知不觉中使用它们。 - matt
1
请注意,这已被苹果确认为一个错误,并且似乎将在iOS 9中得到修复。 - matt
@matt 你有这个 Bug 的任何其他信息吗?我遇到了相反的情况:我想明确保留边距,以获取在所有设备上(包括 iOS 8.0 到 9.3)的自定义和标准单元格之间的一致外观。在某些情况下(例如 iPhone6+横向页面),分隔符插入和布局边距也不同。我目前唯一可行的解决方案是将所有边距覆盖为固定值。 - Frederik Winkelsdorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接