2013-07-11 60 views
2

我想設置我的看法如下iOS的自動佈局未知高地

layout http://i40.tinypic.com/2eulm4z.png

每個視圖包含若干子視圖,如標籤和按鈕。 對於我的項目,我必須使用自動佈局。 具體來說,我使用名爲FLKAutolayout的第三方庫,它可以讓事情變得更快。 問題是每個視圖都有一個動態高度。 將每個視圖的兩側固定在父視圖的每一側都可以。 但是,當涉及垂直排列事物時,我遇到了模糊的佈局。 我試圖將視圖1固定到超級視圖的頂部,查看2的頂部固定視圖1的底部,查看3的頂部固定視圖2的底部,依此類推。如果我不把最底層的視圖固定在超視圖的底部,則什麼也不顯示。如果我將最底部的視圖固定在超視圖的底部,則只有最頂部的視圖會拉伸至屏幕的全部大小。如果我手動將高度限制爲任意數量,事情就會顯得很好。當然,問題在於我根本不知道高度應該是多少,因爲它們取決於內容。

是否有一個很好的策略來管理具有變量高度的視圖數組? 此外,我想我需要補充一點,有可能(也可能)視圖的總高度大於包含這些垂直視圖的視圖控制器視圖的高度大小。最終我希望能夠通過UIScrollView滾動瀏覽它們,但現在可以繼續在屏幕外繼續操作。

回答

0

我不認爲有沒有辦法做到這一點沒有設置具體的高度的意見。您可以爲它們中的每一個製作IBOutlets,並根據內容大小修改它們的常量參數。我想另一種可能的方法是在IB中給它們任意大小,然後在添加任何子視圖之後調用sizeThatFits。

3

每個UIView有一個-(CGSize)intrinsicContentSize方法。如果視圖的內容動態變化,則應該覆蓋該方法並根據視圖的內容返回適當的尺寸。自動佈局使用此信息來計算視圖的高度。您可能需要致電-(void)invalidateIntrinsicContentSize讓系統知道固有尺寸已更改。順便說一句:大多數Apple提供的UIKIT類已經提供了適當的固有尺寸。

+0

我認爲intrinsicContentSize可能有事可做更新滾動視圖與此,但我將如何計算視圖?它不應該根據它的子視圖和它們的約束自動計算它嗎? – Sethypie

+0

如果您正在製作自定義視圖,它需要一些幫助。如果您更多地說出這些是什麼樣的自定義視圖,它會有所幫助。 – Maarten

+0

我在容器視圖中遞歸調用了所有subviews intrinsicSize,事實證明,高度實際上是使containerview如此之大的原因。爲什麼它會計算不正確的內在內容大小?子視圖都只是UILabels,UIButtons和UIImages。 – Sethypie

0

我不知道FLKAutoLayout。但我一直在嘗試類似的情況,並取得了成功。

如圖所示,view1,view2,view3以線性佈局方式相互鏈接。

現在,您應該手動設置每個視圖的高度約束。另外,確保最後一個視圖也有一個用superView設置的垂直空間約束。

現在,訣竅是爲superView設置一個手動高度約束,並將其優先級設置爲比所有其他約束更低的值。就像,如果您有1000個設置爲其他約束的優先級,請爲此superView的約束設置999。

現在,當您在view1,view2,view3中呈現您的內容時,通過相應的高度約束(通過更改其常量值)相應地更改它們的高度。你會發現subView現在自動調整位置,superview也會自己調整它的高度。

現在,要鍛鍊scrollview的東西,你只需要更新contentSize。作爲通過改變約束高度,不帶出實際高度馬上,你有以下的回調 -viewDidLayoutSubViews

我希望這會鍛鍊你的方案