2017-12-02 462 views
0

我有一個垂直滾動視圖,我想要動態添加內容。爲了做到這一點,我將一個Content Size Fitter組件和一個Vertical Layout Group組件添加到了內容遊戲對象中,這樣,只要我將新的遊戲對象實例化爲其子對象,它的Rect變換就會自動增長。如果滾動條已經在底部,我想在底部添加新對象後將滾動條保持在底部。所以我做了這樣的:內容的Rect變換由Content Size Fitter更新後,如何獲得Unity Scroll Rect滾動到底部?

if (scrollRect.verticalNormalizedPosition == 0) 
    { 
     isAtBottom = true ; 
    } 

    ScrollViewItem item = Instantiate(scrollViewItem, scrollRect.content) ; 

    if (isAtBottom) 
    { 
     scrollRect.verticalNormalizedPosition = 0 ; 
    } 

然而,這不起作用,因爲新實例化的滾動查看項目並沒有增加我設置verticalNormalizedPosition到零的時間變換的矩形的大小。所以當Rect變換最終更新時,滾動到底部爲時已晚。

爲了說明問題,假設我的內容高度爲400像素,滾動條一直處於底部。現在我添加一個對象,它是100像素高。然後我將滾動條發送到底部,但它仍認爲內容高度爲400像素。然後內容大小更新爲500像素,但滾動條降低了400像素,因此它只有80%的降低,而不是100%。

有兩種可能的方法來解決這個問題。我希望強制內容大小配合器立即更新,或者作爲響應內容大小配合器更新作爲事件的方式。

通過研究和實驗,我幾乎把這些線嚴格按照此順序成功地在第一個選項:

Canvas.ForceUpdateCanvases(); 
scrollRect.content.GetComponent<VerticalLayoutGroup>().CalculateLayoutInputVertical() ; 
scrollRect.content.GetComponent<ContentSizeFitter>().SetLayoutVertical() ; 
scrollRect.verticalNormalizedPosition = 0 ; 

然而,它並不完全滾動一路底部。它總是大約20個像素。所以我想知道是否還有一些佈局操作我不會強迫發生。也許這是填充什麼的。

回答

0

好的,我相信我已經知道了。在大多數情況下,在將verticalNormalizedPosition設置爲零之前,您只需要執行Canvas.ForceUpdateCanvases();。但就我而言,我添加到內容本身的項目也有一個垂直佈局組組件和一個內容大小調整組件。所以我必須按照以下順序執行這些步驟:

Canvas.ForceUpdateCanvases(); 

item.GetComponent<VerticalLayoutGroup>().CalculateLayoutInputVertical() ; 
item.GetComponent<ContentSizeFitter>().SetLayoutVertical() ; 

scrollRect.content.GetComponent<VerticalLayoutGroup>().CalculateLayoutInputVertical() ; 
scrollRect.content.GetComponent<ContentSizeFitter>().SetLayoutVertical() ; 

scrollRect.verticalNormalizedPosition = 0 ; 

這是有點遺憾的是圍繞這些方法的文檔太少了。