这是我在找不到解决方案后不得不自己解决的问题。
问题是,在从ScrollRect的内容中删除GameObject元素后,在用户再次开始移动它之前,它不会固定其标准化位置。这可能导致ScrollRect在显示最后一个元素时显示空白,并且已从父元素中停用最后一个图元。
- 直到用户与ScrollRect内容交互后,规范化的位置值才更新
- 在停用元素后,手动设置规范化位置将不起作用,因为它正在处理尚未更新的旧值(原因请参见上文)
我找到的最好的解决方案是
- 在检测到ScrollRect内容中的子项被删除后,强制Canvas更新
- 然后夹紧该值,因为标准化位置已正确更新
示例代码:
if (isRemoving) {
Canvas.ForceUpdateCanvases();
scrollRect.horizontalNormalizedPosition = Mathf.Clamp(scrollRect.horizontalNormalizedPosition, 0f, 1f);
}
好吧,迟到总比不迟到好。我在旧的Unity 5.6x中也有同样的问题。所以,我发现如果等待几帧,在movementType之间切换会导致scrollrect更新。用途:
StartCoroutine(UpdateScrollRect());
IEnumerator UpdateScrollRect()
{
yield return new WaitForEndOfFrame();
yield return new WaitForEndOfFrame();
ScrolRect.movementType = ScrollRect.MovementType.Elastic;
ScrolRect.elasticity = 0f;
yield return new WaitForEndOfFrame();
yield return new WaitForEndOfFrame();
ScrolRect.movementType = ScrollRect.MovementType.Clamped;
}
也可以尝试跳过帧数,这样可以适应你的情况。干杯-摊铺