一尘不染

什么时候应该将transformsAutoresizingMaskIntoConstraints设置为true?

swift

我已经阅读了文档。但我仍然不确定何时不需要将其设置为false。在下面的代码中,如果将其设置为,false则根本看不到标题。如果我将其保留为true,那么一切都很好。

View调试层次结构中的以下内容将给出警告“ 宽度位置 不明确”。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let header = UIView()
    header.translatesAutoresizingMaskIntoConstraints = false
    header.backgroundColor = .orange
    header.heightAnchor.constraint(equalToConstant: 10).isActive = true

    return header
}

我以为只要需要修改代码中的任何内容,都必须设置translatesAutoresizingMaskIntoConstraintsfalse

如果您需要删除其所有约束,然后将其设置为false,然后添加所需的内容,则可能是更正确的说法,在这种情况下,您需要为所有四个方面添加约束。

但是,如果您只需要保留系统为您提供的内容,则在这种情况下,将由tableView管理其位置和宽度,然后保留为true

那正确吗?


阅读 229

收藏
2020-07-07

共1个答案

一尘不染

translatesAutoresizingMaskIntoConstraints 在以下情况下需要将其设置为false:

  1. UIView在代码中创建了一个基于对象的对象(如果文件启用了自动布局,Storyboard / NIB将为您设置该对象),
  2. 而且您想对该视图使用自动布局,而不是基于框架的布局,
  3. 和视图将被添加到一个视图层次 使用自动布局。

在这种情况下,并非所有这些都是正确的。具体来说,是第2点。

从标题视图返回后,标题视图viewForHeaderInSection将添加到表格视图,并frame根据表格视图的当前宽度和您从中返回的高度进行设置heightForHeaderInSection

您可以将子视图添加到根头视图(header在代码中),并使用约束相对于头视图布局这些子视图。

您已经发现了无法在注释中对标题视图本身使用自动布局的原因。在创建视图时,它还不属于视图层次结构,因此您不能将其边缘约束到任何东西。

为了具有动态标头大小,您将需要在视图中添加子视图,header并在这些子视图和之间添加约束header。然后,自动版式可以使用的固有内容大小header来确定标题视图的大小。

由于您不限制的框架header,因此请勿设置translatesAutoresizingMaskIntoConstraintsfalse。您将需要确保子视图上有足够的约束以进行自动布局以确定的大小header

如果子视图的内在内容大小不够,则需要从上到下连续的约束线,并且子视图可能需要一些高度约束。

您添加的所有子视图header 需要translatesAutoresizingMaskIntoConstraints设置为false

您还需要返回 的东西estimatedHeightForHeaderInSection-越接近实际的标题高度的更好-
如果你正在使用tableview.sectionHeaderHeight = UITableViewAutomaticDimension

2020-07-07