我有一个垂直滚动视图,我想动态添加内容。为了做到这一点,我在内容游戏对象上附加了一个内容大小匹配组件和一个垂直布局组组件,这样每当我将新游戏对象实例化为其子对象时,它的rect转换就会自动增长。如果滚动条已经在底部,我希望在底部添加新对象后,滚动条保持在底部。所以我这样做:

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

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

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

但是,这不起作用,因为新实例化的scroll view项在我将verticalNormalizedPosition设置为0时并没有增加rect转换的大小。因此,当rect转换最终更新时,滚动到底部已经太晚了。
举例来说,假设我的内容是400像素高,滚动条一直在底部。现在我添加一个100像素高的对象。然后我将滚动条发送到底部,但它仍然认为内容是400像素高。然后内容大小被更新到500像素,但是滚动条是400像素,所以它只下降了80%,而不是100%。
有两种可能的方法来解决这个问题。我想要一种方法来强制内容大小装配工立即更新,或者一种方法来响应作为事件的内容大小装配工更新。
通过研究和实验,我几乎成功地将这些行按如下顺序排列:
Canvas.ForceUpdateCanvases();
scrollRect.content.GetComponent<VerticalLayoutGroup>().CalculateLayoutInputVertical() ;
scrollRect.content.GetComponent<ContentSizeFitter>().SetLayoutVertical() ;
scrollRect.verticalNormalizedPosition = 0 ;

然而,它并没有完全滚动到底部。它总是在20像素之外。所以我想知道是否还有一些布局操作不是我强迫的。也许是垫子什么的。

最佳答案

好吧,我想我已经想好了。在大多数情况下,在将Canvas.ForceUpdateCanvases();设置为零之前,verticalNormalizedPosition就是您需要做的所有事情。但在我的例子中,我添加到内容本身的项也有一个垂直布局组组件和一个内容大小更合适的组件。所以我必须按以下顺序执行这些步骤:

Canvas.ForceUpdateCanvases();

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

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

scrollRect.verticalNormalizedPosition = 0 ;

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

08-18 13:33
查看更多