UI嵌套Scrollrect

**需求:**当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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值