2015-07-19 43 views
5

我一直在嘗試使用UIStackView在IB中設置一個簡單的容器視圖。我希望這個容器以其唯一排列的子視圖爲中心,並且尊重子視圖的內在內容大小。使用UIStackView中心單個視圖

不幸的是,對準和分配的所有可能的配置中的子視圖拉伸以填充沿着所述軸線的寬度。

這看起來像一個奇怪的邊緣情況或錯誤,因爲一旦我添加第二個觀點的一切行爲與預期和兩個子視圖保持它們的大小由內在的內容大小的方法來定義。

我想知道爲什麼UIStackView的行爲如此。

+2

「[堆棧視圖將第一個和最後一個排列的視圖與其邊沿沿着堆棧軸齊平。對於水平堆疊,這意味着第一個排列的視圖的前緣被固定到堆棧的前緣,最後排列的視圖的後緣被固定到堆棧的後緣。對於垂直堆棧,頂部和底部邊緣分別固定。](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/)「因此,如果你只放入一個子視圖,它將被拉伸以填充堆棧的軸。這是你所看到的嗎? –

+1

是的。我不明白的是,爲什麼這會覆蓋固有內容大小,即使我將內容擁抱優先級設置爲高。 –

回答

8

UIStackView 1000的優先級(最大允許的優先級),這是UILayoutPriorityRequired創建約束。如果可能的話,需要自動佈局以滿足這些限制。

你在「高」優先級(UILayoutPriorityDefaultHigh == 750,我相信)與堆疊視圖的要求約束矛盾,所以自動佈局約束會忽略你的約束。

如果您設置約束優先到1000,然後自動佈局將無法滿足所有需要的約束。它會記錄一個錯誤,並且會破壞其中一個約束。你不會選擇它打破的約束。

注意,只需要突破三個約束解決系統之一,它可以打破任何的三個衝突的約束。但是,打破三個衝突限制中的任何一個都不會離開以您爲中心的系統。您的視圖最終應拉伸,或者佔據堆棧視圖的一端,具體取決於哪些約束自動佈局中斷。未來的iOS版本可能會更改自動佈局,以便打破另一個約束並改變佈局。

目前尚不清楚爲什麼你要使用堆棧視圖來居中視圖。如果您只有一個視圖並且想要居中,請將其父母設置爲簡單的UIView而不是UIStackView,並設置約束以將視圖居中在父視圖中。

如果您使用的是堆棧視圖,因爲有時您需要在堆棧中安排不止一個子視圖,那麼除了您的內容視圖之外,您還應該添加兩個隱藏的間隔視圖(軸的兩端各一個) )。在間隔符之間創建等寬或等高約束。

+0

謝謝!我被「調試層次結構視圖」愚弄了,它顯示_76_是檢查器中約束的優先級。 –

+0

爲什麼我想使用堆棧視圖進行居中?我一直在尋找可以完全在IB中設置的東西。 –

+0

@RobertWijas IB允許您定義'.CenterX'和'.CenterY'約束,這將使視圖居中。點擊「對齊」按鈕(IB工作區右下角的第二個按鈕)或者從子視圖控制拖動到其超級視圖,您將看到「中心」選項。也許我不理解你的評論。 – Rob

相關問題