我在自己的赋值为0的地方打上断点调试,发现value值一开始的确变成0,后面自动变成了1,百思不得其解,就去请教了前辈同事。
viewModel.ScrollbarScrollbar.value = 0;
事实证明,你前辈就是你前辈,他找到了源码,找到了自动变成1的原因,那个滑动条没有加载完成之前有一个地方判断的,巴拉巴拉我忘记了,等会找一下源码看看。
下面是解决办法。
在我的代码里面初始化成这样就好了:
viewModel.ModeContentScrollRect.normalizedPosition = Vector2.zero;
下面是官网资料的例子:
using UnityEngine; using System.Collections; using UnityEngine.UI; // Required when Using UI elements. public class ExampleClass : MonoBehaviour { public ScrollRect myScrollRect; public Vector2 myPosition = new Vector2(0.5f, 0.5f); public void Start() { //Change the current scroll position. myScrollRect.normalizedPosition = myPosition; } }
UGUI的源码
Unity相关的源码
找到ScrollbarEditor.cs,对上了就可以假装自己看懂了
上面的是界面的内容看起来,我找错了
看到导入的包UnityEngine.UI,应该是Scrollbar.cs这个文件,这里是涉及value返回值和numberOfSteps的关系,numberOfSteps为0或者1的时候是原值,其他的会经过计算。
Scrollrect.cs文件里
我的unity里面就是水平的滑动轴
刷新会有这样一个计算过程,那个黄色和蓝色的框框有一个简单的例子,就是在内容大于视图的时候,初始相对位置来计算value。但是view大于content的时候,就是红色框框的计算,可能是我value赋值的位置太早了,因为我的content宽度是动态变化的,所以还没有来得及初始化,就会这样先0后1
这个是官方文档
https://docs.unity3d.com/2018.1/Documentation/ScriptReference/UI.ScrollRect-normalizedPosition.html
这个大佬的知乎文章很值得看看,有 一系列关于UGUI源码的解读
https://zhuanlan.zhihu.com/p/340598873
https://zhuanlan.zhihu.com/p/340598576