刨根問底之 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

參考

相關文章
相關標籤/搜索