在内容中的 removing/deactivating 个子元素之后,ScrollRect 在固定规范化位置时未正确更新位置
ScrollRect does not correctly update the position when clamping the normalized position, after removing/deactivating a child element from the content
这是我在找不到解决方案后不得不自己解决的问题。
问题在于,从 ScrollRect 的内容中移除 GameObject 元素后,它不会固定其规范化位置,直到用户再次开始移动它。这可能会导致 ScrollRect 在显示最后一个元素时显示空 space 并且已停用父元素的最后一个元素。
- 在用户与 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;
}
也尝试玩跳帧数,它适合您的情况。
干杯!
-帕维尔
这是我在找不到解决方案后不得不自己解决的问题。
问题在于,从 ScrollRect 的内容中移除 GameObject 元素后,它不会固定其规范化位置,直到用户再次开始移动它。这可能会导致 ScrollRect 在显示最后一个元素时显示空 space 并且已停用父元素的最后一个元素。
- 在用户与 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;
}
也尝试玩跳帧数,它适合您的情况。 干杯! -帕维尔