2017-12-02 594 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 ; 

这是有点遗憾的是围绕这些方法的文档太少了。