当我们在ScrollView下嵌套子ScrollView时,就会出现父ScrollView不能滑动的情况(方向不同),在网上搜了一些资料,确实有这种情况出现。具体的思路是,把子ScrollView的滑动事件传递给父ScrollView,这样父ScrollView就能接收到所有的滑动事件,也就可以进行滑动。
而滑动事件主要就实现了三个接口,分别是 IBeginDragHandler,IDragHandler,IEndDragHandler 然后实现方法 OnBeginDrag,OnDrag,OnEndDrag,当然要在这三个方法里进行事件过滤,具体代码如下:
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 |
using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace AppFrame.Tools { public class ScrollRectChild : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler { private ScrollRect _parent; private ScrollRect self; private enum Direction { Horizontal, Vertical } // 滑动方向 private Direction _direction; // 操作方向 private Direction _beginDragDirection; public void Awake() { self = GetComponent<ScrollRect>(); if (transform.parent) { _parent = transform.parent.GetComponentInParent<ScrollRect>(); } _direction = self.horizontal ? Direction.Horizontal : Direction.Vertical; } // 开始拖动时已选择控制柄 public void OnBeginDrag(PointerEventData eventData) { if (_parent) { _beginDragDirection = Mathf.Abs(eventData.delta.x) > Mathf.Abs(eventData.delta.y) ? Direction.Horizontal : Direction.Vertical; if (_beginDragDirection != _direction) { // 当前操作方向不等于滑动方向,将事件传给父对象 ExecuteEvents.Execute(_parent.gameObject, eventData, ExecuteEvents.beginDragHandler); return; } } } // 拖动内容时的处理 public void OnDrag(PointerEventData eventData) { if (_parent) { if (_beginDragDirection != _direction) { // 当前操作方向不等于滑动方向,将事件传给父对象 ExecuteEvents.Execute(_parent.gameObject, eventData, ExecuteEvents.dragHandler); return; } } } // 完成内容拖动时的处理 public void OnEndDrag(PointerEventData eventData) { if (_parent) { if (_beginDragDirection != _direction) { // 当前操作方向不等于滑动方向,将事件传给父对象 ExecuteEvents.Execute(_parent.gameObject, eventData, ExecuteEvents.endDragHandler); return; } } } public void OnScroll(PointerEventData data) { if (_parent) { if (_beginDragDirection != _direction) { // 当前操作方向不等于滑动方向,将事件传给父对象 ExecuteEvents.Execute(_parent.gameObject, data, ExecuteEvents.scrollHandler); return; } } } } } |
只要讲上面代码拖到子ScrollView上,然后父子ScrollView各自设置不同方向就可以了。文章源自大腿Plus-https://www.zhaoshijun.com/archives/1854 文章源自大腿Plus-https://www.zhaoshijun.com/archives/1854
我的微信
微信扫一扫
shijun_z
我的QQ
QQ扫一扫
846207670
评论