- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个要动态添加内容的垂直 ScrollView 。为此,我将一个 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
设置为零时,新实例化的 ScrollView 项尚未增加 Rect Transform 的大小。因此,当 Rect Transform 最终更新时,滚动到底部为时已晚。
为了说明,假设我的内容有 400 像素高,滚动条一直在底部。现在我向其中添加一个 100 像素高的对象。然后我将滚动条发送到底部,但它仍然认为内容是 400 像素高。然后内容大小更新为 500 像素,但滚动条向下移动了 400 像素,因此它只向下移动了 80% 而不是 100%。
有两种可能的方法来解决这个问题。我想要一种强制 Content Size Fitter 立即更新的方法,或者一种将 Content Size Fitter 更新作为事件响应的方法。
通过研究和实验,我几乎成功地通过将这些行按以下顺序放置在第一个选项中:
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 ;
遗憾的是,关于这些方法的文档太少了。
关于c# - 在 Content Size Fitter 更新内容的 Rect Transform 后,如何让 Unity Scroll Rect 滚动到底部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613015/
我有一个要动态添加内容的垂直 ScrollView 。为此,我将一个 Content Size Fitter 组件和一个 Vertical Layout Group 组件附加到 Content 游戏对
我是一名优秀的程序员,十分优秀!