从内容中移除/停用子元素后,ScrollRect在夹紧规范化位置时不会正确更新位置



这是我在找不到解决方案后不得不自己解决的问题。

问题是,在从ScrollRect的内容中删除GameObject元素后,在用户再次开始移动它之前,它不会固定其标准化位置。这可能导致ScrollRect在显示最后一个元素时显示空白,并且已从父元素中停用最后一个图元。

  • 直到用户与ScrollRect内容交互后,规范化的位置值才更新
  • 在停用元素后,手动设置规范化位置将不起作用,因为它正在处理尚未更新的旧值(原因请参见上文)

我找到的最好的解决方案是

  1. 在检测到ScrollRect内容中的子项被删除后,强制Canvas更新
  2. 然后夹紧该值,因为标准化位置已正确更新

示例代码:

        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;
    }

也可以尝试跳过帧数,这样可以适应你的情况。干杯-摊铺

最新更新