刨根问底之 translatesAutoresizingMaskIntoConstraints

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

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

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

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 且添加额外约束ui

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

错误提示以下图所示: spa

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

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

1-3 属性值为 falsecdn

// 布局效果等同于 例 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。blog

总结

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

参考

相关文章
相关标签/搜索