Ios 匹配定制的左对齐&;标准UITableViewCell类型

Ios 匹配定制的左对齐&;标准UITableViewCell类型,ios,uitableview,autolayout,Ios,Uitableview,Autolayout,我正在故事板中定义自定义UITableViewCells。我还使用了一些内置的标准样式单元格。我需要设置约束,以便我的自定义单元格与平台定义的单元格匹配(标题在左侧正确对齐) 我注意到,在iOS版本和它运行的设备之间,单元格的左对齐方式会发生变化。左对齐似乎与默认单元格的分隔符设置相同 以下是一些设备和iOS版本的UITableViewCellsseparatorInset: iPad支持7-15分 iPad支持8-20分 iPhone 7-15点 iPhone支持8-16点 其他设备(iP

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

我注意到,在iOS版本和它运行的设备之间,单元格的左对齐方式会发生变化。左对齐似乎与默认单元格的分隔符设置相同

以下是一些设备和iOS版本的
UITableViewCell
s
separatorInset

  • iPad支持7-15分
  • iPad支持8-20分
  • iPhone 7-15点
  • iPhone支持8-16点
其他设备(iPhone6+、iPadMini)可能会有所不同——我没有仔细检查过

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


是否有一种合理的方法来获取这些插入默认值,并在故事板中设置的自动布局约束中使用它们?代码中呢?

在iOS8中,苹果推出了
layoutMargins

您可以在情节提要或代码中进行设置,如下所示:

cell.layoutMargins = UIEdgeInsetsZero // change by your custom value
在此之前,必须将
preservesPerviewLayoutMargins
设置为NO,以防止单元格继承表视图的边距设置

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


希望这能对您有所帮助;)

我遇到了同样的问题,但另一个答案对我没有帮助,因为我在UITableViewController中使用静态单元格。经过几次尝试和错误,我终于找到了一种不用一行代码就能解决iphone6+上的
separatorInset
问题的方法

我只需将UILabel的左边缘与左边距的值0[内容视图(当前距离=0)]对齐。并将UILabel的X位置更改为0。(在我的例子中,在Interface Builder中,边距是7,UILabel的X=8)。这种对齐方式在iPhone4S、5S、6和6+上运行良好

编辑:这在XCode 7中发生了更改。 附加步骤:将相应单元格的
TableViewCell
及其
contentView
的“保留Superview页边距”设置为TRUE,或在IB->Size Inspector中进行检查。请参阅@tebs1200的答案。


希望这能有所帮助。

对我有用的是将这两行代码添加到我的自定义
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}]];

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

  • 确保选择了自定义单元格


  • 确保在“大小检查器”中选择了“保留Superview页边距”

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


  • 确保此处也选择了“保留Superview页边距”(请参见步骤2中的图像)

  • 在自定义原型单元中选择标签(或其他视图)
  • 将其左边缘约束为距边距0像素


  • 这是几年后的事了,我对上面的解决方案没有任何运气。我发现将引导约束(在故事板中)一般设置为16,高度大小class.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单元格来满足需求,而无需混合使用自定义单元格。这似乎解决了对齐问题。

    谢谢–我最近几天才回来讨论这个问题,所以我会检查一下。这是唯一正确的答案。这么简单。谢谢在我将UITableView放入一个与屏幕左侧不齐平的子控制器之前,它一直对我有效。在这种情况下,自定义单元格的边距太小。如果我能找到答案,我将再次发表评论。“保留Superview边距”是一个很好的建议。如果不勾选此项,它只使用8px的标准边距如果
    UILabel
    位于
    UITableView
    的标题视图中(没有单元格),该怎么办?那我们怎么能让
    UILabel
    尊重superview呢?谢谢–我这几天才回来,所以我会检查一下。这就是我需要的!虽然我在size inspector中设置了
    PreserveSPerViewLayoutMargins
    属性。为了使其完全对齐,我还为表视图设置了
    PreserveSPerViewLayoutMargins=YES