ScrollRect не корректно обновляет позицию при фиксировании нормализованной позиции после удаления / деактивации дочернего элемента из содержимого
Это проблема, которую я должен был решить сам, не найдя решений для нее.
Проблема заключалась в том, что после удаления элемента GameObject из содержимого ScrollRect он не будет фиксировать свое нормализованное положение, пока пользователь не начнет перемещать его снова. Это может привести к тому, что ScrollRect будет показывать пустое пространство, когда он отображает последние элементы и деактивирует последний элемент из родительского элемента.
- Нормализованное значение позиции не обновлялось до тех пор, пока пользователь не взаимодействовал с содержимым ScrollRect.
- Установка нормализованного положения вручную после деактивации элемента не будет работать, так как он работал со старыми значениями, которые еще не были обновлены (см. Выше, почему).
2 ответа
Лучшее решение, которое я нашел, это
- Принудительное обновление Canvas после обнаружения дочернего элемента в содержимом ScrollRect.
- Затем зажимаем значение, так как нормализованная позиция была обновлена правильно.
Пример кода:
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;
}
Попробуйте также поиграть с пропуском кадров, чтобы это соответствовало вашей ситуации. Ваше здоровье! -Павел