2012-08-30 10 views
8

我有一個自動佈局的包含視圖控制器的視圖的筆尖,另外還有一個帶有佔位符視圖的窗口將它添加進去。佔位符相對於其超視圖和窗口中的其他視圖具有約束,並且在涉及我的視圖控制器之前,佔位符以我想要的方式調整窗口大小。稍後我加載nib並將其頂層視圖作爲佔位符的子視圖添加,並且我還手動創建約束以使其與佔位符的邊緣保持一致。Autolayout正在調整我的窗口大小

一切都很好,我在我的應用程序中的幾個實例中使用了這種模式,但在某些情況下,添加視圖後,我的窗口被調整大小!縮小到添加視圖的最小尺寸,而不是視圖擴展到當前窗口的大小。

到目前爲止,我發現阻止這種情況的唯一方法是,添加視圖並創建其約束時,還要設置視圖的框架,使其爲佔位符和窗口當前狀態的初始大小。這在某些時候可以,但我希望能夠定義更復雜的約束條件,只需將每條邊對齊到佔位符超級視圖即可。我不想爲每種情況編碼幀算術。

有誰知道發生了什麼事?如果窗口已經規定了佔位符的大小,而不是相反,那麼在添加子視圖以使當前窗口大小仍然優先時,我必須做些什麼?

我看過Xcode IB窗口中的彈出式菜單,它似乎是關於隻影響子視圖和超級視圖(爲所有筆尖設置前者)的約束,與此功能相關的是什麼?我還沒有發現任何其他事情。

+0

編程設置你就不能設置自定義視圖(佔位符)的寬度限制? – codingFriend1

+1

編輯我的帖子,使這更清晰,我希望。在調整窗口大小時,我的佔位符已經有了一些約束條件,使它具有正確的行爲。在添加子視圖時添加固定大小的約束將會破壞它。 –

+0

如果你的約束是正確的,那麼窗口調整大小將工作。 –

回答

9

您希望將壓縮阻力優先級設置爲小於NSLayoutPriorityWindowSizeStayPut,即500.這意味着窗口的大小優先於視圖的大小。

您可以從IB尺寸檢查器進行設置。

Compression resistance priority

或者你可以用-[NSView setContentCompressionResistancePriority:forOrientation:]

+0

這聽起來很對,這是一個優先考慮的問題。但是,在提示發佈的情況下,該窗口比添加的子視圖所需的大。子視圖不會被壓縮,而是被擴展(問題是它沒有擴展,而是縮小了窗口)。這是否意味着壓縮阻力優先權不會發揮作用?必須將內容擁抱優先級設置爲<500,還是我感到困惑? (我一直在使用自動佈局將近一年,但我仍然很難想象這兩組優先事項的目的)。 –

+0

是的,你是正確的,內容擁抱優先級應該<500。壓縮阻力優先級用於在減小空間時計算哪個視圖應該縮小,以及在增加空間時是否擁有內容。隨着窗口停留優先級爲500,那麼任何<500意味着窗口大小勝,> 500視圖勝 – iain