**需求:**当scrollrect A中元素包含scrollrect B时,只能一个起作用,比如A上下滑动,B左右滑动(其实也只能一个上下一个左右滑动)。
**解决:**重写scrollrect相关拖动方法,当为左右滑动时B滑动,当上下滑动时,将滑动事件通过ExecuteEvents传递给A。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class CustomScrollRect : ScrollRect
{
enum Direction
{
HORIZONTAL,
VERTICAL
}
private Direction m_Direction;
private Direction m_CurrentDirection;
private CustomScrollRect m_ParentScrollRect;
protected override void Awake()
{
base.Awake();
m_Direction = this.horizontal ? Direction.HORIZONTAL : Direction.VERTICAL;
Transform parent = transform.parent;
if(parent)
m_ParentScrollRect = parent.GetComponentInParent<CustomScrollRect>();
}
public override void OnBeginDrag(PointerEventData eventData)
{
Vector2 delta = eventData.delta;
Debug.Log("Delta:" + delta);
m_CurrentDirection = Mathf.Abs(delta.x) > Mathf.Abs(delta.y) ? Direction.HORIZONTAL : Direction.VERTICAL;
if(m_ParentScrollRect)
{
Debug.Log("Mark01");
if(m_CurrentDirection != m_Direction)
{
ExecuteEvents.Execute(m_ParentScrollRect.gameObject, eventData, ExecuteEvents.beginDragHandler);
Debug.Log("Mark02");
return;
}
}
base.OnBeginDrag(eventData);
}
public override void OnDrag(PointerEventData eventData)
{
if (m_ParentScrollRect)
{
if (m_CurrentDirection != m_Direction)
{
ExecuteEvents.Execute(m_ParentScrollRect.gameObject, eventData, ExecuteEvents.dragHandler);
return;
}
}
base.OnDrag(eventData);
}
public override void OnScroll(PointerEventData data)
{
if (m_ParentScrollRect)
{
if (m_CurrentDirection != m_Direction)
{
ExecuteEvents.Execute(m_ParentScrollRect.gameObject, data, ExecuteEvents.scrollHandler);
return;
}
}
base.OnScroll(data);
}
public override void OnEndDrag(PointerEventData eventData)
{
if (m_ParentScrollRect)
{
if (m_CurrentDirection != m_Direction)
{
ExecuteEvents.Execute(m_ParentScrollRect.gameObject, eventData, ExecuteEvents.endDragHandler);
return;
}
}
base.OnEndDrag(eventData);
}
}