2014-03-06 31 views
1

我是noob iOS開發人員,我有一個簡短的問題,我已經將頭髮拉出了幾天。UIViewController中的「堆棧」UIViews(iOS 7)

要開始我不使用XCode中的接口生成器,因爲我被告知最好的學習方法是通過代碼來建立一切。

這樣說,我有一個自定義的UIViewController,我在其中添加子視圖。我的問題是這樣的,當他們有可變高度時,我如何自動「堆疊」它們?我的意思是「堆」是這樣的:

|------------------------------------| 
|         | 
|  View 1 (variable height)  | 
|         | 
|------------------------------------| 
|------------------------------------| 
|         | 
|  View 2 (variable height)  | 
|         | 
|------------------------------------| 
|------------------------------------| 
|         | 
|  View 3 (variable height)  | 
|         | 
|------------------------------------| 

現在我計算每個重載「sizeToFit」功能的淵源考/高爲每個子視圖一次所有的人都被渲染。一些視圖包含UIWebView,我等待它們加載來計算高度。

有這樣做的更優雅的方式,不是嗎?

任何代碼示例將不勝感激!

謝謝你的時間!

+0

您已準備好[AutoLayout](https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/Introduction/Introduction.html)和[Visual Format Language](https:// developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW1)? –

+0

爲什麼你不用這個'UITableViewController'? – JMarsh

+0

雖然前兩個傢伙是對的 - 你也做對了!我建議開始學習AutoLayout,因爲它確實節省時間。在iOS世界中,最好的生活方式是重用適合您需求的標準組件。在這個特殊的情況下,UITableView將很適合(你可以在tableview中設置行高:heightForRow:atIndexPath :) –

回答

3

使用自動佈局!

Auto Layout的功能是根據您提供的約束條件爲您管理UI佈局。例如,在上面的視圖層次結構中,您希望對視圖的高度,每個視圖之間的約束和視圖的超視圖的約束進行約束。

由於您正在完成代碼中的所有工作,因此您首先必須在每個視圖上撥打setTranslatesAutoresizingMaskIntoConstraints:,並使用值NO。這告訴佈局系統您希望使用自動佈局並自行設置所有約束。

接下來,您應該爲所有視圖提供約束條件。約束有幾種形式:視圖與其本身之間的約束(高度,寬度等);視圖和對等之間的約束 - 共享同一個超視圖的兩個視圖之間的約束;以及視圖與其超級視圖之間的約束。自動佈局系統不喜歡含糊不清,所以您必須提供一些限制條件,以避免出現問題。對於上述示例,您必須設置每個視圖的高度,其在超視圖內的位置以及一個視圖與另一個視圖之間的距離。

更高級的主題包括內在大小,它會告訴自動佈局,您的視圖可能會根據其內容動態增長和縮小,並且就像它一樣,其他人會作出相應的反應。

定義約束最簡單的方法是使用可視化格式。

我建議先從這些:


做代碼UI VS Interface Builder的一個字。讓我告訴你,不要爲了UI代碼學習UI代碼。提出一個想法,並開始實施這個想法。從Interface Builder開始。您將慢慢了解視圖如何工作,它們是如何工作的,它們是如何工作的,約束如何工作,佈局引擎如何使用約束等。使用Xcode 5時,AutoLayout已經成爲一種喜悅,使用Xcode 5.1時,情況會更好。從Interface Builder開始,您將最終獲得代碼,並隨着時間學習完成任務所需的一切。

學習不應該是「哦,我知道如何在代碼中添加視圖!」;學習應該是「我知道如何解決我必須完成或克服的問題」。如果您可以使用Interface Builder工具完成所有任務,那太好了。使用IB無法解決的問題有哪些?更好的是,現在你正在瞭解視圖和佈局的內部運作。

祝你好運!

+1

感謝您的信息和鏈接!但是,不應該將setTranslatesAutoresizingMaskIntoConstraints設置爲「否」,這就是「良好的視覺格式指南」中所述的內容嗎? – thiesdiggity

+0

@thiesdiggity呃,是的。哎呀 –

相關問題