【问题标题】:Is there a simple way how a custom UITableViewCell can have the same edges as a standard UITableViewCell?有没有一种简单的方法可以使自定义 UITableViewCell 具有与标准 UITableViewCell 相同的边缘?
【发布时间】:2021-04-29 13:38:15
【问题描述】:

我有一个带有静态内容的自定义 UITableViewCell,它有一个 UIStackView 作为内容视图的单个子视图。我希望 UIStackView 使用与 UIKit 中内置的标准 UITableViewCell 相同的水平边距/插图,涵盖从 iOS 9(我的最低部署目标)到当前 iOS 14 的所有 iOS 版本,以及 iPhone 和 iPad 设备。

我天真地开始添加将 UIStackView 的前导/尾随锚点附加到内容视图的 readableContentGuide 的约束。我不喜欢 Interface Builder,所以我的代码是这样的:

UIStackView stackView = [...]
[stackView.leadingAnchor constraintEqualToAnchor:self.contentView.readableContentGuide.leadingAnchor].active = YES;
[stackView.trailingAnchor constraintEqualToAnchor:self.contentView.readableContentGuide.trailingAnchor].active = YES;

这很好用,除了在某些情况下 (1) 标准 UITableViewCell 确实使用readableContentGuide,因此将标准单元格与我的自定义单元格混合看起来很糟糕,因为它们的边缘没有对齐.在这里您可以看到 4 个自定义单元格,顶部和底部各有一个标准单元格:

(1) 它发生在这些场景中:

  • 在带有凹口的 iPhone 设备上,当设备横向握持时
  • 在 iPad 设备上,纵向和横向都可以

我曾尝试使用layoutMarginsGuide 而不是readableContentGuide,但这会导致许多约束错误(“无法同时满足约束。”在 Xcode 的调试输出中)。我也试过设置

self.tableView.cellLayoutMarginsFollowReadableWidth = YES;

在使用我的自定义单元格的表格视图中,这是因为标准单元格现在的边缘与我的自定义单元格位于同一位置。但我不喜欢这种解决方法,首先因为这意味着我必须为每个想要使用我的自定义单元格的表格视图进行特殊设置,其次因为它不必要地减少了可用于数据显示的宽度。

我好像遗漏了什么。是否有一种简单、标准的方式可以使用布局指南来布局自定义 UITableViewCell 的内容,以便自定义单元格内容的边缘与标准单元格的边缘位于同一位置?

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

    您应该可以使用单元格的.contentView.layoutMarginsGuide

    UILayoutGuide *g = self.contentView.layoutMarginsGuide;
    
    [NSLayoutConstraint activateConstraints:@[
    
        [stackView.topAnchor constraintEqualToAnchor:g.topAnchor],
        [stackView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor],
        [stackView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor],
        [stackView.bottomAnchor constraintEqualToAnchor:g.bottomAnchor],
    
    ]];
    

    如果这给您“无法同时满足约束”消息但布局看起来正确 - 这在单元格中使用堆栈视图时很常见 - 您可以忽略消息或给底部锚点低于要求的优先级:

    UILayoutGuide *g = self.contentView.layoutMarginsGuide;
    
    NSLayoutConstraint *c = [stackView.bottomAnchor constraintEqualToAnchor:g.bottomAnchor];
    c.priority = UILayoutPriorityDefaultHigh;
    
    [NSLayoutConstraint activateConstraints:@[
    
        [stackView.topAnchor constraintEqualToAnchor:g.topAnchor],
        [stackView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor],
        [stackView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor],
        
        c,
        
    ]];
    

    【讨论】:

    • 你是对的,当然,layoutMarginsGuide 是我一直在寻找的简单的一站式解决方案。生成“无法同时满足约束”消息是因为我有一个自定义约束(即不是由 UIStackView 制作的),事后看来这是令人尴尬的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2021-04-03
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多