当前位置: 首页 > 知识库问答 >
问题:

TranslatesAutoreszingMaskIntoConstraint什么时候应该设置为true?

艾俊晖
2023-03-14

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

以下视图调试层次结构将发出警告“宽度和位置不明确”。

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
}

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

也许更正确的说法是,如果您需要删除它的所有约束,然后将其设置为< code>false,然后添加您喜欢的内容,在这种情况下,您需要为所有4条边添加约束。

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

是这样吗?

共有3个答案

萧麒
2023-03-14

有了潘卡伊·维尔玛的回答,它终于有了意义。

在我的例子中,我有一个ImageView,只设置了2个约束,但错误显示我有更多的约束,LayoutConstraints是无法同时满足约束:

        view.addSubview(imageView)
        let yConstraint = imageView.centerYAnchor.constraint(equalTo: layout.centerYAnchor)
        yConstraint.identifier = "yConstraint"
        let xConstraint = imageView.centerXAnchor.constraint(equalTo: layout.centerXAnchor)
        xConstraint.identifier = "xConstraint"

错误信息:

[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x600000089360 h=--& v=--& UIImageView:0x7fc1782087b0.minY == 0   (active, names: '|':UIView:0x7fc176406220 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x600000089220 h=--& v=--& UIImageView:0x7fc1782087b0.height == 0   (active)>",
    "<NSLayoutConstraint:0x600000088c30 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600001a880e0'UIViewLayoutMarginsGuide']-(34)-|   (active, names: '|':UIView:0x7fc176406220 )>",
    "<NSLayoutConstraint:0x600000088cd0 'UIView-topMargin-guide-constraint' V:|-(48)-[UILayoutGuide:0x600001a880e0'UIViewLayoutMarginsGuide']   (active, names: '|':UIView:0x7fc176406220 )>",
    "<NSLayoutConstraint:0x600000088d70 'yConstraint' UIImageView:0x7fc1782087b0.centerY == UILayoutGuide:0x600001a880e0'UIViewLayoutMarginsGuide'.centerY   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000088d70 'yConstraint' UIImageView:0x7fc1782087b0.centerY == UILayoutGuide:0x600001a880e0'UIViewLayoutMarginsGuide'.centerY   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

对于我设置的第二个约束(“xConstraint”),基本上有一个几乎相同的错误日志。正如您在错误日志中看到的那样,我“过度约束”了我的UI。除了“y约束”之外,我还有4个其他约束。我相信约束在元组中,因此围绕它们的悖论。XCode 试图通过提示“(注意:如果您看到 NS 自动调整掩码布局限制,请参阅 UIView 属性的文档翻译自动调整掩码因托约束)”,但就我个人而言,我认为这还不够有帮助。

我想知道这意味着什么很重要,因为它正在转换为约束,因此得名translatesAutoreszingMaskIntoConstraint。它是UIView的一个实例属性,包含一个整数位掩码。它保存您可以打开和关闭的位,用于“灵活的左边距”和“灵活的高度”等功能(这里有更多)。

当视图的边界发生变化时,该视图会根据每个子视图的自动调整大小掩码自动调整其子视图的大小。

来源

因此,总结一下自动调整大小蒙版,它保留了所需的自动调整大小功能,例如灵活的高度和宽度。

松琦
2023-03-14

> < li>

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

如果属性为(或设置为)True,系统会根据视图的框架及其自动调整大小的掩码自动创建一组约束。并且如果添加自己的约束,它们不可避免地会与自动生成的约束发生冲突。这会创建一个不可满足的布局。所以当以编程方式实例化视图时,一定要将它们的translatesAutoreszingMaskIntoConstraint属性设置为NO。

邬宜然
2023-03-14

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

    < li >在代码中创建基于< code>UIView的对象(如果文件启用了自动布局,Storyboard/NIB将为您设置), < li >并且您希望对此视图使用自动版式,而不是基于框架的版式, < li >该视图将被添加到使用自动布局的视图层次结构中。

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

从视图返回标题视图ForHeaderInSection 后,该标题视图将添加到表格视图中,并且其框架将根据表格视图的当前宽度和从高度返回的高度进行设置。

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

您已经在注释中发现了不能对页眉视图本身使用自动版式的原因;创建视图时,它还不是视图层次的一部分,因此不能将其边约束到任何对象。

为了动态调整页眉大小,您需要向页眉视图添加子视图,并在这些子视图和页眉之间添加约束。然后,自动布局可以使用标头的固有内容大小来确定标头视图大小。

由于您没有约束标头的框架,因此不要将翻译自动调整掩码因限制设置为 false。您需要确保对自动布局的子视图有足够的约束,以确定页眉的大小。

您将需要从上到下的连续约束线,如果子视图的固有内容大小不足,则可能需要为该子视图提供一些高度约束。

您添加到标头的任何子视图都需要translatesAutoreszingMaskIntoConstraint设置为false

如果您使用的是tableview,还需要从estimatedHeightForHeaderInSection中返回一些信息,越接近实际的页眉高度越好。sectionHeaderHeight=UI表格视图自动尺寸

 类似资料:
  • 问题内容: 我已经阅读了文档。但我仍然不确定何时不需要将其设置为。在下面的代码中,如果将其设置为,则根本看不到标题。如果我将其保留为,那么一切都很好。 View调试层次结构中的以下内容将给出警告“ 宽度 和 位置 不明确”。 我以为只要需要修改代码中的任何内容,都必须设置为。 如果您需要删除其所有约束,然后将其设置为,然后添加所需的内容,则可能是更正确的说法,在这种情况下,您需要为所有四个方面添加

  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可

  • 问题内容: 我莫名其妙地迷糊了自己。 不知何故,我想到用AJAX(如$ .post)打PHP时,您必须回显“ true”或“ false”,而不是返回true / false。我现在知道不是这种情况,但是有人可以为我分解吗? 测试布尔值是否存在问题?像这儿 那是有问题的情况,对吗?在这里,我不能返回true / false,而是必须回显一个字符串并测试该字符串,是吗? 但是我看到布尔true /

  • 问题内容: 我看过各种文章,但我仍然不知道为什么不应该使用它。请让我知道您的想法。 问题答案: 我发现有必要在错误的设计中使用instanceof提示。可以肯定的是,将会出现一个大型,复杂的开关风格的构造。在我看到的其他大多数情况下,我们应该使用多态而不是instanceof。请参阅策略模式。(相关的使用示例) 我唯一需要使用的是实现时。