• unity3D scrollview嵌套不能滑动的问题及其解决办法


    unity3D scrollview嵌套不能滑动的问题

    问题来源:

    现在有这么一个需求,有一个页面,希望外面是一个水平方向滑动的scrollView A,A的子对象是一种能在垂直方向滑动的scrollview,此时,如果不做特殊处理,子对象的交互性会挡住外层scrollview的滑动性。

    问题原因:

    当我们点击子对象并且进行滑动时,外层的scrollview接收不到滑动事件。

    解决办法:

    在子对象滑动时,将拖拽事件传递给外层的scrollview,做法是给每一个子对象添加一个脚本Compoment,在这个脚本中做好拖拽事件的传递(当然,也可以在Unity的editor中,将写好的脚本拖拽到对应的scrollview对象上,只不过这样做很不灵活,本人不愿意这么操作),代码如下所示:

    
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    //scrollViewItem 是子scrollview对象需要添加的component
    public class scrollViewItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {
        // Start is called before the first frame update
    
        private ScrollRect scrollview;
        
        public void setScrollView(ScrollRect scrollview)
        {
            this.scrollview = scrollview;
        }
    
    	//子scrollview调用OnBeginDrag时,传递OnBeginDrag到外层的scrollview,也就是这里的scrollview
        public  void OnBeginDrag(PointerEventData eventdata)
        {
            Debug.Log("aaaaaaaaaaaaaaaa");
            scrollview.OnBeginDrag(eventdata);
        }
    
        public  void OnDrag(PointerEventData eventdata)
        {
            Debug.Log("bbbbbbbbbbbbbbb");
            scrollview.OnDrag(eventdata);
        }
    
        public  void OnEndDrag(PointerEventData eventdata)
        {
            Debug.Log("ccccccc");
            scrollview.OnEndDrag(eventdata);
        }
    }
    
    //ListBigItem是对子scrollview对象的一个封装
    public class ListBigItem
    {
        public ListBigItem(GameObject obj, int idx, ScrollRect _parrentRect)
        {
        	//在子scrollview对象上添加上面的脚本
            obj.AddComponent<scrollViewItem>();
            //传递最外层scrollview到添加的脚本对象。
            obj.GetComponent<scrollViewItem>().setScrollView(_parrentRect);
            gameObject = obj;
            transform = obj.transform;
            curIdx = idx;
            parrentRect = _parrentRect;
            scrollview = gameObject.GetComponent<ScrollRect>();
            init(scrollview);
    
        }
        public GameObject gameObject;
        public Transform transform;
        public List<ListSmallItem> smalLitemList;
        ScrollRect parrentRect;
        ScrollRect scrollview;
        int curIdx;
    
        public void init(ScrollRect scroll)
        {
        //"Prefabs/NodeDateHead" 是子scrollview对象希望包含的子节点预制体
            GameObject prefabItem = Resources.Load<GameObject>("Prefabs/NodeDateHead");
            int itemTotalNum = 6;
            Vector3 initPos = prefabItem.transform.position;
            Vector2 itemSize = prefabItem.GetComponent<RectTransform>().sizeDelta;
            smalLitemList = new List<ListSmallItem>();
            scroll.content.sizeDelta = new Vector2(itemSize.x, itemSize.y * itemTotalNum);
            scroll.GetComponent<RectTransform>().sizeDelta = new Vector2(itemSize.x, itemSize.y * itemTotalNum);
            for (int i = 0; i < itemTotalNum; i++)
            {
                GameObject smallItem = UnityEngine.Object.Instantiate(prefabItem, scroll.content);
                smallItem.transform.localPosition = new Vector3(0, 0 - itemSize.y * i, initPos.z);
                ListSmallItem item = new ListSmallItem(smallItem);
                item.initData(i, curIdx);
                smalLitemList.Add(item);
                Debug.Log(smallItem.transform.position.y);
            }
        }
    }
    
    //类containt 是主类
    public class containt : MonoBehaviour
    {
        Button preButton;
        Button postButton;
        ScrollRect scroll;
        List<ListBigItem> bigItemList;
    
        void Awake()
        {
            int weekNum = 7;
            //"Prefabs/scrollViewNode" 是子scrollview预制体
            GameObject item = Resources.Load<GameObject>("Prefabs/scrollViewNode");
            Vector2 itemSize = item.GetComponent<RectTransform>().sizeDelta;
            Vector3 initPos = item.transform.position;
            bigItemList = new List<ListBigItem>();
            scroll.content.sizeDelta = new Vector2(itemSize.x * weekNum, itemSize.y);
            for (int i = 0; i < weekNum; i++)
            {
                GameObject scrollitem = Instantiate(item, scroll.content);
                scrollitem.transform.localPosition = new Vector3(0 + i * itemSize.x, 0, initPos.z);
                ListBigItem bigItem = new ListBigItem(scrollitem, i, scroll);
                bigItemList.Add(bigItem);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110

    如果有疑问,欢迎评论区一起讨论! ^_^

  • 相关阅读:
    基于JSP实现OA办公系统
    Spring的3级缓存和循环引用的理解
    附参考文献丨艾美捷Cholesterol胆固醇说明书
    java计算机毕业设计水库洪水预报调度系统源码+系统+数据库+lw文档+mybatis+运行部署
    docker创建nginx容器
    java面试题整理《基础篇》四
    生物神经网络 原理分析研读01
    【系统设计与实现】基于flink的分心驾驶预测与数据分析系统
    【DockerCE】Docker-CE 20.10.18正式版发布
    IntelliJ IDEA 2023.2正式发布,新UI和Profiler转正
  • 原文地址:https://blog.csdn.net/qq_41841073/article/details/134431614