有个ScrollView
当其中的content被修改后(且有scrollbar 存在时)如果我们直接
public void changeContent(string newTextString){
content.text=newTextString;
scBar.value=0f;
}
这时候这个scrollView不会被拉到最下面(或最上面) 很多时候会停到中间
我猜想是因为content的大小还没有真正地 被content size fitter修改
网上有的说加一句
yield return WaitForEndOfFrame();
在我这里没有解决问题 但很多人说可以 所以你也可以试试
我解决的办法是真的“等一下”它刷新
像这样
public void changeContent(string newTextString){
content.text=newTextString;
Invoke("helper", 0.1f);
}
public void helper(){
scBar.value=0f;
}
在今天之前是ok的但是我新创造的一个scrollView上不知道为什么这样也不行
奇怪母亲给奇怪开了门了属于是
总之
有个我目前感觉绝杀的办法 很简单
把Rect Transform的Pivot Y 改成0就好了
虽然不知道为什么 但就是管用
希望有大神能帮我解释其科学原理
好的我错了以上这种方法的问题凸显出来了
比如说每次我想让改变后的content靠最上面 把最下面一行字露出来
我就得把Pivot Y设为0 但这样的结果就是只有几行的时候所有字都贴在下面
非常奇怪
那么只好再找办法
因祸得福我也多少发现了这个问题的起源
来自于ScrollRect的LateUpdate里面
if (m_ViewBounds != m_PrevViewBounds || m_ContentBounds != m_PrevContentBounds || m_Content.anchoredPosition != m_PrevPosition)
{
UpdateScrollbars(offset);
UISystemProfilerApi.AddMarker("ScrollRect.value", this);
m_OnValueChanged.Invoke(normalizedPosition);
UpdatePrevData();
}
每次lateUpdate都会UpdateScrollbars(offset);而这个就会把scrollBar的size以及value调整到“合适的”大小 很多时候都不是我们想要的位置
而且由于是lateUpdate 很难用我的代码去覆盖掉
所以只好绕过去
怎么搞呢
加一个这个
private bool zeroing=true;
public void changeContent(string newTextString){
content.text=newTextString;
zeroing = true;
}
public void chasing()
{
if (zeroing == true)
{
scBar.value = 0;
zeroing = false;
}
}
并且把chasing放在scrollRect的onValueChange里面让它在lateUpdate时call我们的chasing()
注意是放在scrollRect的onValueChange里 我这里的是我重载过取消了普通拖拽的scrollRect Plus版本
不知道为什么Unity设计的时候要每次刷新value而且这个value还不能设定
anyway 我们用这个方法就绕过去了