57 lines
1.9 KiB
C#
57 lines
1.9 KiB
C#
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.UI;
|
|
|
|
// Прокрутка внутри прокрутки (например, лента карточек вбок внутри вертикального списка).
|
|
// Свайп в сторону своей оси листает эту ленту, свайп поперёк и колесо мыши -- родительский список.
|
|
// Без этого палец на ленте "застревает": общий список не прокручивается.
|
|
public class NestedScrollRect : ScrollRect
|
|
{
|
|
ScrollRect parentScroll;
|
|
bool routeToParent;
|
|
|
|
protected override void Start()
|
|
{
|
|
base.Start();
|
|
if (transform.parent != null) parentScroll = transform.parent.GetComponentInParent<ScrollRect>();
|
|
}
|
|
|
|
bool CrossAxis(PointerEventData e)
|
|
{
|
|
float dx = Mathf.Abs(e.delta.x), dy = Mathf.Abs(e.delta.y);
|
|
return horizontal && !vertical ? dy > dx : vertical && !horizontal ? dx > dy : false;
|
|
}
|
|
|
|
public override void OnInitializePotentialDrag(PointerEventData e)
|
|
{
|
|
if (parentScroll != null) parentScroll.OnInitializePotentialDrag(e);
|
|
base.OnInitializePotentialDrag(e);
|
|
}
|
|
|
|
public override void OnBeginDrag(PointerEventData e)
|
|
{
|
|
routeToParent = parentScroll != null && CrossAxis(e);
|
|
if (routeToParent) parentScroll.OnBeginDrag(e);
|
|
else base.OnBeginDrag(e);
|
|
}
|
|
|
|
public override void OnDrag(PointerEventData e)
|
|
{
|
|
if (routeToParent) parentScroll.OnDrag(e);
|
|
else base.OnDrag(e);
|
|
}
|
|
|
|
public override void OnEndDrag(PointerEventData e)
|
|
{
|
|
if (routeToParent) parentScroll.OnEndDrag(e);
|
|
else base.OnEndDrag(e);
|
|
routeToParent = false;
|
|
}
|
|
|
|
public override void OnScroll(PointerEventData e)
|
|
{
|
|
if (parentScroll != null) parentScroll.OnScroll(e);
|
|
else base.OnScroll(e);
|
|
}
|
|
}
|