gpt4 book ai didi

ios - 具有自动布局左边距的 UITableViewCell 在 iPhone 和 iPad 上不同

转载 作者:IT王子 更新时间:2023-10-29 07:34:20 24 4
gpt4 key购买 nike

我正在为选项屏幕/场景使用带有静态单元格的分组 UITableView。一切都在 Xcode 6.1/iOS 8.1.x/Storyboard 中使用自动布局完成。在表格组中有混合类型的单元格,有两种类型会给我带来问题:

  1. 具有自定义样式的单元格和
  2. 样式为“Right Detail”的单元格

在单元格 #1 上,我可以为标签和前导容器之间的左边距设置约束。据我所知,在 #2 单元格上,我无法在 Interface Builder 中设置任何约束。我在单元格 #1 中的标签上设置了左边距,以便它与单元格 #2 中的标签对齐。在 iPhone 上一切看起来都很好,但如果我在 iPad 上显示同一张表,其中 TableView 容器的大小是屏幕大小的一半,单元格 #2 获得更多边距(动态?),而单元格 #1 保持绝对边距 I在约束中设置。我还尝试使用“相对于边距”属性更改单元格 #1 中的左边距,但无济于事。

苹果手机:

Table on iPhone

iPad(tableview 宽度 = 1/2 屏幕尺寸)

Table on iPad

所以问题是:如何为单元格 #1 中的标签设置约束,使其像单元格 #2 一样对齐。

这里还有一个指向演示该问题的 Xcode 6.1 示例项目的链接。在 iPhone 和 iPad 上运行以查看差异:

https://dl.dropboxusercontent.com/u/5252156/Code/tableViewTest.zip

这个问题可能与 Layout static table cell for iPhone and iPad 有关,但它也可能与 iOS 8 不同,因为现在一切都应该是自适应的。这就是为什么我还是决定发布这个问题。

最佳答案

如何修复

在与 apple bug 报告团队进行了许多示例项目和屏幕截图并剖析之后 that answer ,我发现让您的自定义样式单元格在其边距方面表现一致并且就像默认的 UITableViewCells 一样的解决方案,您必须执行以下操作(主要基于 Becky's answer ,我强调了不同之处和不同之处让它对我有用):

  1. 在 IB 中选择您单元格的内容 View

  2. 转到尺寸检查器

  3. 在 Layout Margins 部分,选中 Preserve Superview Margins(不要点击加号)

    Checking preserve superview margins

  4. (这是关键)对单元格本身(如果愿意的话,内容 View 的父级)执行相同的操作

    The cell and not the content view this time

  5. 按如下方式设置约束:Label.Leading = Superview.Leading Margin(常量为 0)

    Setting the constraint for the custom cell's label

现在所有单元格的标签都将与默认单元格一致!这在 Xcode 7 及更高版本中对我有用,它包括我提到的线程中提到的修复。 IB 和模拟器现在应该显示正确对齐的标签。

Final result in the simulator

您也可以通过编程方式执行其中的一些操作,例如在 View Controller 的类中:

cell.preservesSuperviewLayoutMargins = true
cell.contentView.preservesSuperviewLayoutMargins = true

或者你可以通过在启动时调用一次 UIAppearance 来设置它(我只知道 Swift,抱歉):

UITableViewCell.appearance().preservesSuperviewLayoutMargins = true
UITableViewCell.appearance().contentView.preservesSuperviewLayoutMargins = true

它如何以及为何起作用

作为Ethan请指出,Apple 自己的 UIView 文档对 preservesSuperviewLayoutMargins 的描述如下:

When the value of this property is true, the superview’s margins are also considered when laying out content. This margin affects layouts where the distance between the edge of a view and its superview is smaller than the corresponding margin. For example, you might have a content view whose frame precisely matches the bounds of its superview. When any of the superview’s margins is inside the area represented by the content view and its own margins, UIKit adjusts the content view’s layout to respect the superview’s margins. The amount of the adjustment is the smallest amount needed to ensure that content is also inside the superview’s margins.

因此,如果您希望您的单元格的内容与 TableView 的 边距对齐(如果您愿意的话,它是曾祖 parent ),您需要让您的内容的两个上级,Content View 和 Table Cell 本身, 保留他们自己的 super View 的边距。

为什么这不是默认行为让我感到惊讶:我觉得大多数不想自定义所有内容的开发人员都希望默认情况下有这种“继承”。

关于ios - 具有自动布局左边距的 UITableViewCell 在 iPhone 和 iPad 上不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27420888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com