匹配自定义&标准UITableViewCell类型的左对齐。

问题描述 投票:32回答:5

我在定义自定义 UITableViewCell的故事板中。我也在使用一些内置的标准样式单元格。我需要设置约束条件,使我的 自定义单元格与平台定义单元格相匹配 (让它们的标题在左边正确对齐)。

我注意到,单元格的左对齐方式在iOS版本和它所运行的设备之间会发生变化。它 看来 如左对齐方式与默认单元格相同。separatorInset.

这里是 UITableViewCells separatorInset 对于一些设备和iOS版本。

  • iPad上7 -15点。
  • iPad在8上 - 20点。
  • iPhone 在 7 上 - 15 点。
  • iPhone在8上 - 16点。

其他设备(iPhone 6+,iPad Mini)可能会有所不同--我还没有完全检查。

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

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

ios uitableview autolayout
5个回答
35
投票

我也有同样的问题,但其他答案无法帮助我,因为我在UITableViewController中使用静态单元格。经过几次试错,我终于找到了解决的方法。separatorInset 在iPhone 6+上不需要一行代码就能解决这个问题。

enter image description here

我只是简单地将UILabel的左边缘与左边距值0[内容视图(当前距离=0)]对齐,并改变UILabel的X位置以获得0。而且还改变了UILabel的X位置,得到0。这个对齐方式在iPhone 4S、5S、6和6+上都很好用。

EDIT:在XCode 7中,这个改变了。额外的步骤。设置各单元格的 "保留超级视图边距"。TableViewCell 及其 contentView 为 "true "或在IB -> 尺寸检查器中检查。参考@tebs1200的回答。

希望这能帮到你。


31
投票

你可以实现以下建议的解决方案 马克 纯粹在故事板中。

  1. 确保自定义单元格被选中。

    Table View Cell selected in view tree

  2. 确保 保留视线范围 在 "尺寸 "检查器中选择了

    'Preserve Superview Margins' selected in the Size inspector

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

    enter image description here

  4. 确保 保留视线范围 在这里也被选中(见步骤2中的图片)。

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

    enter image description here


7
投票

对我有用的是在我的自定义的 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}]];

2
投票

在iOS8中苹果推出了 layoutMargins

你可以在你的故事板或你的代码中设置它,就像这样。

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

在此之前,你必须设置 preservesSuperviewLayoutMargins没有防止单元格继承表视图的边距设置。

保留SuperviewLayoutMargins。 : 一个布尔值,表示当前视图是否也尊重其上层视图的边距。

希望这能帮助你;)


0
投票

这是多年以后的事了,我对上面的解决方案没有任何运气。 我发现,将领先约束(在故事板中)一般设置为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单元格来满足要求,而不用混入自定义单元格。 这样似乎可以解决对齐问题。

© www.soinside.com 2019 - 2024. All rights reserved.