解决嵌套Scrollview造成的滑动冲突
2019-08-20 本文已影响0人
迷途小路
当一个Scrollview套在另一个Scrollview中时,(方向不同)则外层的会被屏蔽,这里可以添加上这样一个脚本来解决,
思路为:子框监听滑动事件,开始滑动时判断手势的方向,根据方向来启用对应的滑动框。
参考文章:https://www.cnblogs.com/suoluo/p/5643885.html
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class NestedScrollRect : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
public ScrollRect parentScrollRect; //父框
ScrollRect scrollRect; //子框
const bool isUpAndDown = true; //子框的滑动方向
void Awake () {
scrollRect = GetComponent<ScrollRect> ();
if (parentScrollRect == null) {
parentScrollRect = scrollRect.GetComponentsInParent<ScrollRect> () [1]; //查找父节点的Scrollview
}
}
//开始拖动
public void OnBeginDrag (PointerEventData eventData) {
parentScrollRect.OnBeginDrag (eventData);
float angle = Vector2.Angle (eventData.delta, Vector2.up); //拖动方向和up方向的夹角
//根据夹角判断启用哪一个Scrollview
if (angle > 45 && angle < 135) {
scrollRect.enabled = !isUpAndDown;
parentScrollRect.enabled = isUpAndDown;
} else {
scrollRect.enabled = isUpAndDown;
parentScrollRect.enabled = !isUpAndDown;
}
}
//拖动中
public void OnDrag (PointerEventData eventData) {
parentScrollRect.OnDrag (eventData);
}
//结束拖动,需要将2个滑动框都启用
public void OnEndDrag (PointerEventData eventData) {
parentScrollRect.OnEndDrag (eventData);
scrollRect.enabled = true;
parentScrollRect.enabled = true;
}
}