2017-08-09 34 views
0

編程方式(因爲Interface Builder是由Satan設計的),如何以同樣的方式將一個視圖對象置於另一個視圖對象之下?以編程方式將視圖對象放置在最近的鄰居下方

如果這是第一個視圖對象:

titleLabel.frame.size.width = view.frame.width - 32 
titleLabel.frame.origin.x = CGFloat(16) 
titleLabel.frame.origin.y = CGFloat(titleMargin + 32) 

我怎麼會第二視圖對象位置正下方呢?我必須創建一個函數來獲取它上面的所有東西的高度,並將其設置爲頂部邊距?看起來很粗糙。

subtitleLabel.frame.size.width = view.frame.width - 32 
subtitleLabel.frame.origin.x = CGFloat(16) 
subtitleLabel.frame.origin.y = ??? 

我預計解決方案比例子的設計要複雜得多。

+0

使用視圖之間的關係而不是絕對座標是採用基於約束的佈局的好理由。 –

+0

這就是計劃。 –

+0

不,您可以在代碼中創建約束。請參閱:https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/ProgrammaticallyCreatingConstraints.html –

回答

1

嘛,不使用約束和自動佈局(這是完全獨立IB的,順便說一句),更改最後一行:

titleLabel.frame.size.width = view.frame.width - 32 
titleLabel.frame.origin.x = CGFloat(16) 
titleLabel.frame.origin.y = CGFloat(titleMargin + 32) 

subtitleLabel.frame.size.width = view.frame.width - 32 
subtitleLabel.frame.origin.x = CGFloat(16) 
subtitleLabel.frame.origin.y = titleLabel.frame.origin.y + titleLabel.frame.size.height 

然後,當然,如果您要添加其他元素並希望它「請遵循以下」:

nextLabel.frame.size.width = view.frame.width - 32 
nextLabel.frame.origin.x = CGFloat(16) 
nextLabel.frame.origin.y = subtitleLabel.frame.origin.y + subtitleLabel.frame.size.height 

如果你有很多的元素,無論是跟蹤y位置的變量或使用對象瓦爾維持「previousObject」和「currentObject」。

舉個例子,無論如何。