ScrollRect не корректно обновляет позицию при фиксировании нормализованной позиции после удаления / деактивации дочернего элемента из содержимого

Это проблема, которую я должен был решить сам, не найдя решений для нее.

Проблема заключалась в том, что после удаления элемента GameObject из содержимого ScrollRect он не будет фиксировать свое нормализованное положение, пока пользователь не начнет перемещать его снова. Это может привести к тому, что ScrollRect будет показывать пустое пространство, когда он отображает последние элементы и деактивирует последний элемент из родительского элемента.

  • Нормализованное значение позиции не обновлялось до тех пор, пока пользователь не взаимодействовал с содержимым ScrollRect.
  • Установка нормализованного положения вручную после деактивации элемента не будет работать, так как он работал со старыми значениями, которые еще не были обновлены (см. Выше, почему).

2 ответа

Решение

Лучшее решение, которое я нашел, это

  1. Принудительное обновление Canvas после обнаружения дочернего элемента в содержимом ScrollRect.
  2. Затем зажимаем значение, так как нормализованная позиция была обновлена ​​правильно.

Пример кода:

        if (isRemoving) {
            Canvas.ForceUpdateCanvases();
            scrollRect.horizontalNormalizedPosition = Mathf.Clamp(scrollRect.horizontalNormalizedPosition, 0f, 1f);
        }

Что ж, лучше поздно, чем никогда. У меня такая же проблема в моем старом Unity 5.6x. Итак, я обнаружил, что переключение между motionType вызывает обновление 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;
    }

Попробуйте также поиграть с пропуском кадров, чтобы это соответствовало вашей ситуации. Ваше здоровье! -Павел

Другие вопросы по тегам