我嘗試以編程方式更改視圖的自動佈局約束(我在此命名爲FOO視圖),但我無法做到這一點。我想辦法是枚舉viewController的主視圖的所有約束(我將其命名爲主視圖)。爲什麼FOO視圖的自動佈局約束是在主視圖上設置的,而不是在FOO視圖本身上設置的?
我的問題是,爲什麼約束與主視圖相關,而不是與FOO視圖相反?
我嘗試以編程方式更改視圖的自動佈局約束(我在此命名爲FOO視圖),但我無法做到這一點。我想辦法是枚舉viewController的主視圖的所有約束(我將其命名爲主視圖)。爲什麼FOO視圖的自動佈局約束是在主視圖上設置的,而不是在FOO視圖本身上設置的?
我的問題是,爲什麼約束與主視圖相關,而不是與FOO視圖相反?
如果約束是具有相對約束到它的父然後其約束將在上海華..,
而如果約束是不相對像修復寬度或高度那麼它們在視圖本身...
而背後的原因是蘋果公司設計的,它是這樣.. :)
Er. Khatri's answer是正確的。這是Apple公約/定義,只有他們的工程師可以肯定地回答你的問題。然而,有一個很合理的解釋,我想補充,補充定義到查看約束添加規則:
約束僅包含佈局從一個單一的視圖屬性直接添加到該視圖。
view1.width = 50
view1.height = 100
view1.width = 0.5 * view1.height
約束添加至上海華。
view1.leading = view2.trailing + 8
view1.bottom = view2.bottom - 8
約束被添加到他們的第一個共同的超視圖。
label1.baseline = label2.baseline
有兩個原因(我能想到的,或許蘋果有更多的理由):
真實性:
寬度,高度和縱橫比內在性質的單一視圖。他們與任何其他觀點無關。所以這是有道理的,這個特定的視圖擁有這些約束。另一方面,當您將兩個視圖的位置相互關聯時,這些約束在視圖之間「共享」。目前尚不清楚哪個視圖本身應該具備這些約束條件。所以爲了避免混亂,我們需要一個可靠的規則來選擇哪些視圖作爲約束的所有者。上面的規則明確無誤。對於佈局引擎
便利:
約束從頂部解析爲底部(即,從上海華到子視圖)。因此,當「有疑問」時,始終向視圖層次結構中較高的視圖添加約束是合理的。這對於佈局引擎也很方便,因爲當它佈置特定視圖的子視圖時,它已經具有這些約束,並且不需要詢問其子視圖的約束(大小和寬高比約束除外)。