刨根问底之 translatesAutoresizingMaskIntoConstraints

6,037

我们查看官方文档,可以看到文档是这样介绍该属性的:它是一个用来决定,是否将视图的自动调整大小的遮罩(autoresizing mask)转换为 Auto Layout 约束的布尔值。

通过文档介绍我们可以得知:当该属性为 true 时,系统会自动通过视图的 autoresizing mask 创建一组视图的约束,这些约束是基于你提供的 frame、bounds、center 这些属性。也就是说,当你给视图的 frame 赋值之后,它会为你创建静态的、基于 frame 的 Auto Layout 约束。如例 1-1 代码所示:

1-1 属性值为 true且指定 frame

let exampleView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
// 系统根据你指定的frame 给 exampleView 创建静态的 Auto Layout 约束
exampleView.backgroundColor = UIColor.green
view.addSubview(exampleView)

在上述情况中,你是不能给视图添加额外的约束来修改它的位置或大小的,如果添加额外的约束会导致约束冲突。如例 1-2 代码所示:

1-2 属性值为 true,指定 frame 且添加额外约束

...
// 例 1-1面的代码下添加此代码,会导致约束冲突
NSLayoutConstraint.activate([
    exampleView.widthAnchor.constraint(equalToConstant: 50)
    ])

错误提示如下图所示:

添加额外约束导致约束冲突

如果你想使用 Auto Layout 动态计算、改变视图尺寸的话,你必须将该属性值改为 false 。然后你只需提供无歧义、无冲突的约束即可。如例 1-3 代码所示:

1-3 属性值为 false

// 布局效果等同于 例 1-1
let exampleView = UIView(frame: .zero)
exampleView.backgroundColor = UIColor.green
view.addSubview(exampleView)
// 使用 Auto Layout 时,务必将此属性值设为 false
exampleView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    exampleView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100),
    exampleView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 100),
    exampleView.widthAnchor.constraint(equalToConstant: 100),
    exampleView.heightAnchor.constraint(equalToConstant: 100)
    ])

当你代码创建视图时,视图的 translatesAutoresizingMaskIntoConstraints 默认为 true,当你使用 Interface Builder 时,系统会自动将 translatesAutoresizingMaskIntoConstraints 的值设为 false。

总结

  • 代码创建视图时,视图的 translatesAutoresizingMaskIntoConstraints 属性值默认为 true
  • Interface Builder 中创建视图时,系统会自动将视图的 translatesAutoresizingMaskIntoConstraints 属性值设为 false
  • 代码创建的视图,且使用 frame 进行布局时,不能添加额外的约束,会导致约束冲突
  • 代码创建的视图,且使用 Auto Layout 进行布局时,需将属性值设为 false

参考