应该将translatesAutoresizingMaskIntoConstraints设置为true吗?

我已经阅读了文档 。 但我仍然不确定何时不需要将其设置为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 } 

我想每当我需要修改代码中的任何内容时,我都必须将translatesAutoresizingMaskIntoConstraints设置为false

也许更正确的说法是你需要删除所有约束然后将其设置为false然后添加你喜欢的东西,在这种情况下你需要为所有4个边添加约束。

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

是对的吗?

translatesAutoResizingMaskIntoConstraints需要将translatesAutoResizingMaskIntoConstraints设置为false:

  1. 您在代码中创建一个基于UIView的对象(如果文件启用了autolayout,Storyboard / NIB将为您设置),
  2. 并且您希望为此视图使用自动布局而不是基于帧的布局,
  3. 并且视图将添加到使用自动布局的视图层次结构中。

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

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

您可以将子视图添加到根标题视图(代码中的header ),并使用约束来布置相对于标题视图的子视图。

您已经在评论中发现了无法在标题视图中使用autolayout的原因; 在创建视图时,它还不是视图层次结构的一部分,因此您不能将其边缘约束到任何东西。

要使用动态页眉大小调整,您需要将子视图添加到header视图中,并在这些子视图和header之间添加约束。 然后,自动布局可以使用header的内在内容大小来确定标题视图大小。

由于您没有约束header框架,因此不要将translatesAutoResizingMaskIntoConstraints设置为false 。 您需要确保对自动布局的子视图有足够的约束以确定header的大小。

如果子视图的内在内容大小不足,您将需要从上到下的连续约束线以及潜在的子视图高度约束。

您添加到header任何子视图需要translatesAutoResizingMaskIntoConstraints设置为false

你还需要从estimatedHeightForHeaderInSection返回一些东西 – 越接近你的实际标题高度越好 – 如果你使用tableview.sectionHeaderHeight = UITableViewAutomaticDimension

  • 对于以编程方式创建的视图,默认值为true ,对于Interface Builder的视图,默认值为false

    如果属性为(或设置为)True, 则系统会根据视图的框架及其自动调整蒙版自动创建一组约束 。 如果添加自己的约束,它们不可避免地会与自动生成的约束发生冲突 。 这会产生不可满足的布局。 因此,在以编程方式实例化视图时,请务必将其translatesAutoresizingMaskIntoConstraints属性设置为NO