2017-01-10 36 views
2

我有在UIComponent是一個簡單的視圖(I收窄問題)。 這裏是XIB和類:如何在運行時知道UIComponent的寬度?

enter image description here

然後我把這個組件在故事板的圖,將其約束:

enter image description here

所以通常紅色矩形具有不同寬度取決於設備寬度。

這是圖形化的情況下,該組件正確地調整自身大小,但是當我調用該函數打印寬度,結果總是一樣的,無論設備啓動應用程序。

實際上,該值一直在故事板的部件的實際寬度。

這是太奇怪了。 有沒有辦法知道UIComponent的實際寬度?

幫助將不勝感激:)

+0

約束如何配置? – Scriptable

+0

@Eric - 什麼是它打印出來'打印(self.frame.width)'的價值?它顯示任何價值,或返回零?你是如何爲StatBarView設置'NSLayoutConstraint'值的?你有沒有設置它們的寬度是相對的還是等於它的超視圖,還是左右兩側限制在它的超視圖的左右邊緣? – Pierce

+0

StatBarView具有高度修正,垂直居中,左右兩側限制爲超視圖。打印的值是故事板的StatBarView寬度,它不與運行時的寬度相對應。例如,如果我在故事板中設置iPhone SE,則寬度爲239像素,即使在iPhone 7 plus上執行時也會使用此值。 – Eric

回答

1

在設置約束之後但在嘗試獲取其寬度之前,應在視圖上使用layoutIfNeeded()。約束不適用於激活時

(抱歉,2個答案^^他們太不同了)

+0

謝謝,它可以工作,你搖滾! ! – Eric

1

最好不要同時使用兩個約束和框架標記。堅持約束,併爲每個元素的寬度制定一個新約束。每個元素的寬度應通過乘數與父視圖的寬度相關。

舉例來說,你應該做這樣的事情

NSLayoutConstraint(item: element, attribute: .width, relatedBy: .equal, toItem: parentView, attribute: .width, multiplier: 0.5, constant: 0) 

作出元素佔據其parentView寬度

隨後的50%,如果你想改變它,你應該有一個新的代替舊的約束一個新的期望倍數當然。這種具有替代洗牌的存在是因爲乘數屬性是隻得到

順便說一句,如果你想改變你的組件中的每一個元素佔據的寬度的百分比我的答案是對的情況。如果提議始終保持相同(50%25%25%),則在組件更改其大小時無需更改約束。與組件尺寸約束相關的所有元素也將更改它們的尺寸(如果通過約束更改組件的尺寸)

+0

感謝您的幫助@Pavel。試圖在我的變量的setter中實現這一行,但它崩潰與「未準備好約束的視圖層次」。無論如何,當我設置百分比值時,子視圖會重新調整大小,但是它是用父寬度來計算的,這是不正確的。這是我的問題。我不明白爲什麼'self.frame.width'在運行時沒有得到值,但是從故事板獲得了值(此外我沒有設置約束!) – Eric

相關問題