是的,這可以做到。
如果您設置視圖的translatesAutoresizingMaskIntoConstraints = YES
,則在運行時將自動將setFrame:
的調用轉換爲基於視圖的當前autoresizingMask
的佈局約束。這使您可以將基於框架的佈局與基於約束的佈局混合。
例如,您可以使用自動佈局來定義視圖的所有子視圖的佈局,但仍然調用setFrame:
來設置視圖本身的大小和位置。從你的角度來看,你正在使用自動佈局和直接幀操作混合進行佈局。但系統實際上使用約束來處理所有事情。
但是,有一個關於使用translatesAutoresizingMaskIntoConstraints
的重要警告。
當你這樣做,你仍然需要確保這些自動約束可以滿足其他約束。
所以,舉例來說,假設有已經決定您的視圖的大小和位置的限制,然後你也設置translatesAutoresizingMaskIntoConstraints = YES
並呼籲setFrame:
。對setFrame:
的調用將對該視圖產生新的約束,這可能與已經存在的約束相沖突。 (事實上,這個錯誤經常發生,如果你看到一條日誌消息抱怨衝突約束,並且其中一個約束是NSAutoresizingMaskLayoutConstraint
,那麼你看到的是與自動約束的衝突。一個簡單的錯誤,因爲translatesAutoresizingMaskIntoConstraints = YES
是默認值,所以如果你在代碼中配置約束條件,如果你不想要這些自動約束條件,則需要記住將它關閉。)
與此相反,假設有已經存在確定您的視圖的大小和位置的約束條件,但在您致電setFrame:
之前,請設置translatesAutoresizingMaskIntoConstraints = NO
。在這種情況下,您的setFrame:
調用不會產生新的約束,因此在單獨的約束之間不會產生衝突。但是,在這種情況下,在約束和您設置的框架值之間仍存在「衝突」。在下一次調用自動佈局時,它會在視圖中看到已經存在的約束條件,計算它們所需的幀值,並將幀設置爲所需的值,並手動設置您設置的值。
有關更多詳細信息,請參閱Apple的Cocoa Auto Layout Guide中的「採用自動佈局」部分。
這個工程,但我看到很多日誌中的警告。任何人都可以建議使用這種方法的正確方法是什麼?或者我應該忽略這些警告?謝謝 – Husyn
如果您看到不可滿足約束條件的警告,那麼這些警告可能是有意義的。如果您在視圖上使用'compiledAutoresizingMaskIntoConstraints = true'來查看它們,那麼您可能正在發生的事情*已經*有一些約束(可能設置在IB中)試圖控制該視圖的框架。框架上的那些舊約束與自動調整掩碼中自動生成的約束相互作用。在那種情況下,答案就是消除那些舊約束。如果您將它們添加到IB中,只是爲了讓IB在設計時閉嘴,您可以讓它們「佔位符」丟失它們。 – algal
幹得好!好的答案! – Developer