Skip to content

循环列表嵌套问题 #217

@NiurouLee

Description

@NiurouLee

我们开发中遇到了一个纵向列表的元素中,嵌套了一个横向列表,因此我添加了如下修改

        public LoopScrollRect parentScorll;
        public virtual void OnBeginDrag(PointerEventData eventData)
        {
            if (this.IgnoreDragEvent || eventData.button != PointerEventData.InputButton.Left)
                return;

            if (!IsActive())
                return;
            if (parentScorll)
            {
                if (Mathf.Abs(eventData.delta.x) - Mathf.Abs(eventData.delta.y) > triggerParentValue)
                {
                    m_curDirection = Direction.Horizontal;
                }

                if (Mathf.Abs(eventData.delta.y) - Mathf.Abs(eventData.delta.x) > triggerParentValue)
                {
                    m_curDirection = Direction.Vertical;
                }

                if (m_curDirection != direction)
                {
                    //当前操作方向不等于滑动方向,将事件传给父对象
                    //当Parent是自己的时候会死循环StackOverflow
                    if (parentScorll.gameObject != this.gameObject)
                    {
                        ExecuteEvents.Execute(parentScorll.gameObject, eventData, ExecuteEvents.beginDragHandler);
                    }

                    return;
                }

                if (IgnoreMove)
                {
                    //当Parent是自己的时候会死循环StackOverflow
                    if (parentScorll.gameObject != this.gameObject)
                    {
                        ExecuteEvents.Execute(parentScorll.gameObject, eventData, ExecuteEvents.beginDragHandler);
                    }

                    return;
                }
            }
            //End
            StopMovement();
            UpdateBounds();

            m_PointerStartLocalCursor = Vector2.zero;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(viewRect, eventData.position,
                eventData.pressEventCamera, out m_PointerStartLocalCursor);
            m_ContentStartPosition = m_Content.anchoredPosition;
            m_Dragging = true;
        }

        public virtual void OnEndDrag(PointerEventData eventData)
        {
            if (this.IgnoreDragEvent || eventData.button != PointerEventData.InputButton.Left)
                return;
            if (parentScorll)
            {
                if (parentScorll.m_Dragging)
                {
                    if (parentScorll.gameObject != this.gameObject)
                    {
                        ExecuteEvents.Execute(parentScorll.gameObject, eventData, ExecuteEvents.endDragHandler);
                        m_Dragging = false;
                        
                        return;
                    }
                }

                
                if (Mathf.Abs(eventData.delta.x) - Mathf.Abs(eventData.delta.y) > triggerParentValue)
                {
                    m_curDirection = Direction.Horizontal;
                }

                if (Mathf.Abs(eventData.delta.y) - Mathf.Abs(eventData.delta.x) > triggerParentValue)
                {
                    m_curDirection = Direction.Vertical;
                }

                if (m_curDirection != direction)
                {
                    //当前操作方向不等于滑动方向,将事件传给父对象
                    //当Parent是自己的时候会死循环StackOverflow
                    if (parentScorll.gameObject != this.gameObject&&parentScorll.m_Dragging)
                    {
                        ExecuteEvents.Execute(parentScorll.gameObject, eventData, ExecuteEvents.endDragHandler);
                        m_Dragging = false;

                        return;
                    }
                    

                }
                if (IgnoreMove)
                {
                    //当Parent是自己的时候会死循环StackOverflow
                    if (parentScorll.gameObject != this.gameObject)
                    {
                        ExecuteEvents.Execute(parentScorll.gameObject, eventData, ExecuteEvents.endDragHandler);
                    }

                    return;
                }
            }

            //End
            m_Dragging = false;

            if (vertical && verticalNormalizedPosition <= 0)
            {
                dataSource.OnEndTopDrag();
            }

            if (horizontal && horizontalNormalizedPosition <= 0)
            {
                dataSource.OnEndTopDrag();
            }

            OnEndDragEvent?.Invoke();
        }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions