2014-12-05 62 views
0

我在我的一個項目中使用了自動佈局,並且遇到了我認爲應該是一件小事的麻煩。Autolayout啞(礦)?

舉個例子,我有兩個文字框在對方下面。我在兩點之間創建了一個垂直間距約束。

我期望如果我移動頂部文本框(使用setFrame),約束意味着底部會自動移動它來強制約束?

我的想法是否正確?還是我用自動佈局的方式來實現它的意圖呢?即。我誤解了它的目的。或者我應該使用除setFrame以外的其他方式移動頂部文本框?

任何輸入都會很好。在此先感謝:-)

PS。我玩過使用:setTranslatesAutoresizingMaskIntoConstraints這似乎工作。但是,這似乎並不是這樣做的正確方法。我最初的想法是,自動佈局應該用少量代碼來處理大小/位置關係,在這種情況下,我期望它將用零代碼處理。

+0

我種的是iOS福利局的,但我不認爲自動佈局方面關係,這* *的變化隨着時間的推移。我認爲這是一次性的事情(初始佈局)。所以是的,它聽起來好像你在攻擊它。可能是錯的,雖然... – 2014-12-06 00:37:00

+0

@BrendanHannemann是的,它確實尊重隨時間變化的關係。任何時候你打電話給'setNeedsLayout',它都會重新計算職位的位置。 – fishinear 2014-12-06 01:20:12

+1

但是,混合用戶指定的佈局(setFrame :)和自動佈局是災難的祕訣。既可以使用用戶指定的佈局(覆蓋layoutSubviews並計算兩個框的位置),也可以爲兩者使用用戶自動佈局,也可以使用頂部文本框。 – fishinear 2014-12-06 01:22:23

回答

1

你不能使用setFrame來做到這一點。自動佈局決定框架。如果在事實發生後更改它,約束不會自動更新。

您可以獲得對決定頂部框的Y位置(無論是以編程方式創建它還是使用IBOutlet)並更改其值的約束的引用。這將觸發更新以重新計算所有內容的位置並再次運行佈局。

你可以通過改變NSLayoutConstraint對象上的常量屬性的值來做到這一點。

Reference Docs Here

+0

我使用和操作約束的問題是我想讓第一個控件下面的控件相對於第一個文本框的高度移動。文本框只是一個例子,我真的有一個集合視圖控件,下面有控件。隨着collectionview的內容發生變化,其高度也會變化,因此所有項目都可以隨時查看。我希望集合視圖下方的控件相對於集合視圖的高度向下移動。不知道我是否可以通過引用約束來做到這一點 - 因爲我不確定分配給約束的值是多少? – 2014-12-06 23:39:37

+0

如果要以編程方式控制集合視圖的高度,只需在控件上設置高度約束,並將該約束的常量屬性更改爲您計算的值。但是,這聽起來像是您正在嘗試將頁腳放到集合視圖上。這是一個不同的場景,因爲你真的想把東西放在最後一個單元下面,而不是放在視圖下面。真的嗎? – 2014-12-07 00:13:31

+0

不,不是頁腳。只需要在集合下面出現一些其他控件即可。你的意見給了我一個線索,雖然,建議,我會嘗試創建集合的高度約束,並在運行時更改它。我猜自動佈局將被更有效地用於這種方式,而不是使用上面提到的'setTranslates ....'方法。 – 2014-12-07 16:28:13