【问题标题】:How do I adjust the left margin for prototype cells in a UITableView?如何调整 UITableView 中原型单元格的左边距?
【发布时间】:2014-11-24 06:37:47
【问题描述】:

如果我在 Xcode 中通过 File → New Project... → iOS → Master-Detail Application 创建一个UITableViewController,则使用原型单元创建一个UITableView

生成的视图层次结构是:

在单元格的内容UIView 左边缘和“标题”文本的UILabel 元素之间自动创建一个左“边距”,如下图橙色所示。

这会在运行时在设备的屏幕边缘和UILabel 文本之间产生相应的边距:

那么,这个间隙集的宽度在哪里,又该如何调整呢?

UILabel 的 Size Inspector 中的控件显示为灰色:

我的首选选项是能够在 Interface Builder 中设置此间隙的宽度,但我也想了解此间隙的设置位置,以及如何以编程方式更改它。

【问题讨论】:

  • 您使用的是自定义样式单元格还是基本样式?
  • @JoshValdivieso Basic。以上只是直接取自 Xcode 中默认的 Master-Detail 项目。

标签: ios objective-c uitableview interface-builder


【解决方案1】:

您只需要设置表格视图的contentInset 属性。您可以根据需要设置值。

self.tableView.contentInset = UIEdgeInsetsMake(0, -15, 0, 0);

输出结果

【讨论】:

  • 这行得通,谢谢!你知道是否可以在Interface Builder中设置contentInset
  • @JamieBullock... 是的,即使使用 Interface Builder 也是可能的。为此,在 IB 中选择您的 TableView > 选择身份检查器(右侧 - 第三个选项)> 通过单击加号(+)图标在用户定义的运行时属性中添加如下条目。 [详细信息:Keypath:contentInset,类型:Rect,值:{{0, -15}, {0, 0}}]
  • 我认为这不是一个好的解决方案,如果你这样做,它会使你的 UITableViewCell 向左移动 15,而单元格的右边有 15 边距。
  • 我可以将不同的海军陆战队员分配给不同的单元吗?不是一个人的
  • 这将使内容向左移动 15pt,并在 iOS13 的右侧留出 15pt 空间
【解决方案2】:

转到Main.storyboard > 选择UITableViewCell > Attributes Inspector。将分隔符下拉列表从默认插图更改为自定义插图。将左插图从 15 更改为 0

【讨论】:

  • 这仍然是在 Xcode 的界面构建器中执行此操作的正确方法,在 2019 年使用 Xcode 10.x 和 iOS 12。
【解决方案3】:

iOS 8 开始,单元格属性layoutMargins 可用。 所以调整单元格边距的正确方法是在您的tableView:cellForRowAtIndexPath 或您的自定义UITableViewCell 中以这种方式设置此属性:

override func awakeFromNib() {
    super.awakeFromNib()

    self.layoutMargins = UIEdgeInsetsZero //or UIEdgeInsetsMake(top, left, bottom, right)
    self.separatorInset = UIEdgeInsetsZero //if you also want to adjust separatorInset
}

我希望这可以帮助某人。

【讨论】:

  • 我想建议self.contentView.layoutMargins = UIEdgeInsetsZero 会产生预期的效果。至少对我来说,因为我将所有视图相对于内容视图边距对齐。
  • 我实际上将这些值添加到了 UITableView 本身,而不是单元格中,它运行良好(使用 iOS 9.2)
  • 我想为不同的单元格提供不同的边距,所以请您建议我该怎么做
  • 应使用从 iOS 11 开始的directionalLayoutMargins,根据layoutMargins doc
【解决方案4】:

只需在您的代码中添加以下链接中提到的方法

How do I eliminate the margin on the left side of a UITableView, without creating a gap on the right?

Objective-C中的方法是这样的:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }
    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    [tableView setLayoutMargins:UIEdgeInsetsZero];
    }
    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    cell.preservesSuperviewLayoutMargins = NO;
    [cell setLayoutMargins:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
    [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

Swift 3 和 4

public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    if (cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins))) {
        cell.preservesSuperviewLayoutMargins = false
    }

    if (cell.responds(to: #selector(setter: UIView.layoutMargins))) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if tableView.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        tableView.separatorInset = .zero
    }
    
}

【讨论】:

  • 包含您建议的实际代码/方法,而不是仅共享一个链接!
  • 这就是我要找的!谢谢
【解决方案5】:

如果您对单元格使用 xib,请确保未选中“相对于边距”。您可以通过检查器进行检查,如以下屏幕截图所示:

【讨论】:

  • 如果您正在使用情节提要和笔尖,则非常有用
  • 这是唯一对我有用的答案。您必须选择受限于“contentView”的视图,并更新它的约束,如上图所示。
【解决方案6】:

在 TableView“属性检查器”中,将分隔符插入设置为“自定义”,Left = 0。 这就是你所要做的!

【讨论】:

  • 这会更改 分隔符 插入(例如用于表格组标题),但不会影响单元格内​​容。将 Separator Insets -> Left 设置为 0,不会影响单元格内​​容视图左边缘和 UILabel 之间的空间。
  • 你是对的!但是,您需要在您的情况下使用“自定义样式单元格”,其中表格视图分隔符插入 left = 0。您可以注意到在 milanpanchal 屏幕截图的右侧,分隔符和披露指示符向左移动了 15px .
  • "自定义样式单元格" - 让您将标签放置在所需位置,表格视图分隔符插入 left = 0 - 将调整分隔符位置。
  • 感谢您的信息。实际上,我已经在我的项目中使用了自定义单元格。我提出问题的动机是了解基本单元格布局的工作原理,@milanpanchal 的回答通过显示边距来自UITableViewcontentInset 属性来说明这一点。
【解决方案7】:

正如 WTIFS 所提到的,UITableViewCellindentation 属性是在内置单元格样式中缩进文本标签的好方法。只需执行以下操作即可获得不错的左边距:

cell.indentationLevel = 2;

然而,这不适用于 imageView。

【讨论】:

  • 这会归档单元格文本标签上的缩进级别,而不是整个单元格以及可选的图像视图。
  • @return0 不幸的是,这是真的添加注释
  • 嘿,不用担心。我发现这样做的最好方法就是制作一个自定义 UIViewCell。这几乎是最简单的选择,并且具有更大的灵活性。
【解决方案8】:

这是 Chetan 答案的快速版本:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        tableView.separatorInset = UIEdgeInsets.zero
        tableView.layoutMargins = UIEdgeInsets.zero
        cell.preservesSuperviewLayoutMargins = false
        cell.layoutMargins = UIEdgeInsets.zero
        cell.separatorInset = UIEdgeInsets.zero
}

【讨论】:

    【解决方案9】:

    如果您只想更改单元格文本标签的左边距,则根据您想要的填充将Horizontal Space Constraint 'Constant' 更改为 16 或 8。(这是在 nib 文件中)。如果无法到 'constant' 选择标签,在 FrameRectangle View 中更改 x 坐标,然后点击左侧的约束图钉)

    【讨论】:

      【解决方案10】:

      我想我只是想出了一个简单的解决方案。哈哈。

      上面的答案有一些问题......它减少了左边的差距,但导致了右边的差距。

      我在 Interface Builder 中使用了约束

      首先在表格视图中添加一个-15左边距约束

      然后在表格单元格中添加一些缩进,使内容看起来更好。


      这里有一些分步图片:

      添加约束。记得取消选中“到最近邻居的间距”。

      表格单元格将向左移动。但似乎太接近边缘了。

      所以选择表格单元格,并在右侧区域添加一些缩进。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 2011-08-26
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多