【问题标题】:Matching left alignment of custom & standard UITableViewCell types匹配自定义和标准 UITableViewCell 类型的左对齐
【发布时间】:2015-06-03 16:29:45
【问题描述】:

我在情节提要中定义了自定义UITableViewCells。我还使用了一些内置的标准样式单元格。我需要设置约束,以便我的自定义单元格与平台定义的单元格匹配(它们的标题在左侧正确对齐)。

我注意到单元格的左对齐在 iOS 版本和运行它的设备之间发生了变化。 似乎左对齐与默认单元格separatorInset相同。

这里是 UITableViewCells separatorInset,适用于一些设备和 iOS 版本:

  • iPad 上 7 – 15 分。
  • iPad 8 – 20 分。
  • iPhone 7 – 15 分。
  • iPhone 8 – 16 分。

其他设备(iPhone 6+、iPad Mini)可能有所不同——我没有彻底检查过。

您将如何确保自定义单元格和内置单元格的标签左对齐相同?

是否有一种合理的方式来获取这些插入默认值并将它们用于在情节提要中设置的自动布局约束中?在代码中呢?

【问题讨论】:

    标签: ios uitableview autolayout


    【解决方案1】:

    我遇到了同样的问题,但另一个答案对我没有帮助,因为我在 UITableViewController 中使用了静态单元格。经过几次反复试验,我终于找到了无需一行代码即可解决 iPhone 6+ 上的separatorInset 问题的方法。

    我只是将 UILabel 的左边缘与左边距的值 0 [内容视图(当前距离 = 0)] 对齐。并更改 UILabel 的 X 位置以获取 0。(对于我的情况,在 Interface Builder 中,边距为 7,UILabel 的 X = 8)。对齐在 iPhone 4S、5S、6 和 6+ 上运行良好。

    编辑:这在 XCode 7 中发生了变化。 附加步骤:将各个单元格的TableViewCell 及其contentView 的“Preserve Superview Margins”设置为 TRUE 或在 IB -> Size Inspector 中检查。参考@tebs1200 的回答。

    希望这会有所帮助。

    【讨论】:

    • 谢谢 - 我最近几天才回来,所以我会检查一下。
    • THIS 是唯一正确的答案。很简单。谢谢!
    • 这对我有用,直到我将 UITableView 放在不与屏幕左侧齐平的子控制器中。在这种情况下,自定义单元格的边距太小。如果我能找到答案,我会再次发表评论。
    • “保留 Superview 边距”是一个很好的提示。如果您不检查它,它只会使用 8px 的标准边距
    • 如果UILabelUITableView 的标题视图中(没有单元格)怎么办?我们怎样才能让UILabel尊重superview那么
    【解决方案2】:

    您可以完全在情节提要中实现Mark建议的解决方案:

    1. 确保选择了自定义单元格。

    2. 确保在尺寸检查器中选择Preserve Superview Margins

    3. 现在选择单元格的内容视图

    4. 确保在此处也选择了 Preserve Superview Margins(参见步骤 2 中的图片。)

    5. 在您的自定义原型单元格中选择标签(或其他视图)。
    6. 限制它的左边距边缘 0 个像素。

    【讨论】:

      【解决方案3】:

      对我有用的是将这两行添加到我的自定义 UITableViewCell 实现中:

      self.preservesSuperviewLayoutMargins = YES;
      self.contentView.preservesSuperviewLayoutMargins = YES;
      // ... add test view to content view...
      

      然后我使用默认间距的自动布局:

      [self.contentView addConstraints:[NSLayoutConstraint 
        constraintsWithVisualFormat:@"H:|-[testView]-|" options:0 metrics:nil 
         views:@{@"testView":testLabel}]];
      
      [self.contentView addConstraints:[NSLayoutConstraint 
        constraintsWithVisualFormat:@"V:|-[testView]-|" options:0 metrics:nil 
         views:@{@"testView":testLabel}]];
      

      【讨论】:

      • 谢谢 - 我最近几天才回来,所以我会检查一下。
      • 这就是我需要的!虽然我在尺寸检查器中设置了preservesSuperviewLayoutMargins 属性。
      • 为了使其完美对齐,我还为表格视图设置了preservesSuperviewLayoutMargins = YES
      【解决方案4】:

      在 iOS8 中苹果引入了layoutMargins

      您可以像这样在故事板或代码中设置它:

      cell.layoutMargins = UIEdgeInsetsZero // change by your custom value
      

      在此之前,您必须将 preservesSuperviewLayoutMargins 设置为 NO防止单元格继承 Table View 的边距设置

      preservesSuperviewLayoutMargins :一个布尔值,指示当前视图是否也尊重其父视图的边距。

      希望对你有所帮助;)

      【讨论】:

        【解决方案5】:

        这是多年后的事了,我对上述解决方案没有任何运气。我发现将主要约束(在情节提要中)设置为 16,将高度大小类 .compact 设置为 20,适用于各种设备上的 iOS 13。但是,对于较旧的 iOS 版本,我最终将该约束连接到自定义单元格的类并添加以下内容:

            @IBOutlet var stackViewLeadingConstraint: NSLayoutConstraint!
        
        
            override func layoutSubviews() {
                super.layoutSubviews()
                guard #available(iOS 13, *)
                    else {
                        if traitCollection.verticalSizeClass == .compact {
                            stackViewLeadingConstraint.constant = 16
                        }
                        return
                }
            }
        

        更新:我对这种方法的脆弱性感到紧张。对于我目前的情况,我意识到我可以使用各种系统 tableView 单元格来满足要求,而无需混合自定义单元格。这似乎解决了对齐问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-02
          • 2015-06-07
          • 2021-12-13
          • 1970-01-01
          • 2015-05-21
          相关资源
          最近更新 更多