首页 文章

在内容大小调整器更新内容的Rect变换后,如何让Unity Scroll Rect滚动到底部?

提问于
浏览
1

我有一个垂直滚动视图,我想动态添加内容 . 为了做到这一点,我将Content Size Fitter组件和Vertical Layout Group组件附加到Content游戏对象,这样每当我将新游戏对象实例化为它的子对象时,它的Rect Transform将自动增长 . 如果滚动条已经在底部,我想在底部添加新对象后将滚动条保持在底部 . 所以我这样做:

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

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

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

但是,当我将 verticalNormalizedPosition 设置为零时,这并没有增加Rect Transform的大小 . 因此,当最终更新Rect Transform时,滚动到底部为时已晚 .

为了说明,假设我的内容是400像素高,滚动条一直在底部 . 现在我添加一个高100像素的对象 . 然后我将滚动条发送到底部,但它仍然认为内容是400像素高 . 然后内容大小更新为500像素,但滚动条下降400像素,因此它只有80%的下降而不是100% .

有两种方法可以解决这个问题 . 我想要一种强制内容大小Fitter立即更新的方法或者作为事件响应Content Size Fitter更新的方法 .

通过研究和实验,我几乎成功地通过将这些行按照这个确切的顺序放在第一个选项中:

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

但是,它并没有完全滚动到底部 . 它总是大约20像素 . 所以我想知道是否还有一些布局操作,我不是强迫发生的 . 也许这是填充物或其他东西 .

1 回答

  • 1

    好的,我相信我已经明白了 . 在大多数情况下,在将 verticalNormalizedPosition 设置为零之前,您需要完成 Canvas.ForceUpdateCanvases(); . 但就我而言,我添加到内容本身的项目也有一个Vertical Layout Group组件和一个Content Size Fitter组件 . 所以我必须按以下顺序执行这些步骤:

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

    围绕这些方法的文档很少,这有点遗憾 .

相关问题