我已阅读documentation。但我还不确定何时不需要将其设置为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
。
是吗?
答案 0 :(得分:27)
translatesAutoResizingMaskIntoConstraints
需要设置为false:
UIView
的对象(如果文件启用了autolayout,则Storyboard / NIB将为您设置),在这种情况下,并非所有这些都是真的。具体来说,第2点。
从viewForHeaderInSection
返回标题视图后,它会添加到表格视图中,并根据表格视图的当前宽度和从{{1}返回的高度设置其frame
}。
您可以将子视图添加到根标题视图(代码中为heightForHeaderInSection
),并使用约束来布置相对于标题视图的子视图。
您在评论中发现了无法在标题视图中使用autolayout的原因;在您创建视图时,它还不是视图层次结构的一部分,因此您无法将其边缘限制为任何内容。
要进行动态页眉调整,您需要在header
视图中添加子视图,并在这些子视图和header
之间添加约束。然后,自动布局可以使用header
的内在内容大小来确定标题视图大小。
由于您没有约束header
的框架,因此请勿将header
设置为translatesAutoResizingMaskIntoConstraints
。您需要确保对自动布局的子视图有足够的约束,以确定false
的大小。
如果子视图的内在内容大小不足,您将需要从上到下的连续约束线以及潜在的子视图高度约束。
您添加到header
的所有子视图需要header
设置为translatesAutoResizingMaskIntoConstraints
您还需要从false
返回某些内容 - 越接近实际标题高度越好 - 如果您使用estimatedHeightForHeaderInSection
答案 1 :(得分:15)
对于以编程方式创建的视图,默认值为 true 和for Interface Builder默认的视图为 false
如果属性为(或设置为)True,系统会根据视图的框架及其自动调整遮罩自动创建一组约束。如果你添加自己的约束,它们不可避免地与自动生成的约束冲突。这会产生不可满足的布局。因此,在以编程方式实例化视图时,请务必将 translatesAutoresizingMaskIntoConstraints 属性设置为否。
答案 2 :(得分:0)
有了PANKAJ VERMA
的{{3}},这才说得通。
在我的情况下,我有一个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。除了'yConstraint'
外,我还有其他4个约束。我认为约束位于一个元组中,因此周围存在着寄生。 XCode试图通过提示“(注意:如果您看到的是您不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性translatesAutoresizingMaskIntoConstraints的文档)”,但我个人认为这不够用。 >
我想知道这意味着什么很重要,因为这正转换为约束,因此名称为translatesAutoresizingMaskIntoConstraints
。
它是包含整数位掩码的UIView的instance属性。它保留了一些位,您可以为“灵活的左页边距”和“灵活的高度”(其中更多answer个功能)之类的功能打开和关闭。
当视图的边界发生变化时,该视图会根据每个子视图的自动调整大小蒙版自动调整其子视图的大小。
因此,要总结“自动调整大小蒙版”,它会保留所需的自动调整大小功能,例如灵活的高度和宽度。