2017-09-25 92 views
0

我被一個奇怪的自動佈局錯誤卡住了。更新約束後按鈕位置不正確自動佈局

我有兩個按鈕(確認和刪除)並排,在相同的視圖中,每個都取自己的超視圖的50%的寬度,在某些情況下(當test = true時),我想隱藏確認按鈕所以刪除按鈕會佔用屏幕的所有寬度。

這裏是我的自動佈局:

enter image description here

確認按鈕:

enter image description here

刪除按鈕:

enter image description here

鐠比例寬度是超視圖的50%(1:2)。現在,這裏是我的電話,在viewWillAppear發生:

if test { 
    self.confirmButtonWidthConstraint.constant = 0 
    self.deleteButtonWidthConstraint.constant = (self.deleteButton.superview?.frame.width)! 
} 

但是,這樣做在此之後的結果:

enter image description here

和檢查UI調試後,我可以看到,奇怪的是,這現在刪除按鈕的寬度爲... 480,起始x爲-160。所以我不知道這裏發生了什麼。請幫忙!

enter image description here

+0

如果您的約束使用Autolayout確定的數據(例如視圖的寬度),則應根據確切用例在'viewDidLayoutSubviews()'或'viewWillLayoutSubviews()'中調用相關代碼。 –

+0

感謝您的回答。我嘗試過,但仍得到相同的結果。 – Someday

回答

3

我可以提出一個不同的策略嗎?

將按鈕設置爲堆疊視圖(UIStackView),並將按鈕設置爲平等填充。

然後你可以設置你的按鈕消失與button.isHidden = true。堆棧視圖將優雅地處理你的佈局。

+0

完美地工作!謝謝 – Someday

2

你已經按比例設置的寬度,但正在更新的約束constant財產。這將需要導致您期望的結果,因爲比例寬度將簡單地將constant值添加到乘數結果中。

相反,您應該設置您的約束的multiplier屬性。例如:

if test { 
    self.confirmButtonWidthConstraint.multiplier = 0.0 
    self.deleteButtonWidthConstraint.multiplier = 1.0 
} 
+0

噢,我現在看到我的錯誤是什麼。我最終使用了Jack Daw的解決方案,因爲它對我來說似乎更「自然」,但它絕對有意義。再次感謝 ! – Someday

+0

是的,他的解決方案是首選。真高興你做到了。快樂的編碼! – beyowulf