当我们在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
					 
							

 
					
评论