之前写过相关组件:https://blog.youkuaiyun.com/qq_34987964/article/details/100937002
这次遇到项目需求, 重写并优化了代码
结构上面基本没有变化 , 包含一个使用示例:
代码部分:
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/**
* 视窗ScrollRect垂直自动排序(Item固定长高/节点复用/无限滚动)
* ContentParent上面不能有Layout和SizeFitter组件,其他窗口默认ScroView即可
* Item需要设置minAnchors(0.5,1),maxAnchors(0.5,1)<以父节点的上边中点为锚点>
*/
public class ScrollViewVerticalSort<T> : MonoBehaviour
{
//创建节点初始化委托
//参数:实例化节点
//返回值:对此节点设置属性的Action委托
public Func<Transform, Action<T>> CreateEvent;
//Viewport节点(可视范围节点)
public RectTransform m_Viewport;
//Item父节点/预制体节点
public RectTransform m_ContentParent;
public RectTransform m_ContentItem;
//Item高宽
private float itemHeight;
private float itemWidth;
//Itam行列间隔
private float spacingWidth;
private float spacingHeight;
/// <summary>列数量(x轴上排列几个)</summary>
private int colCount;
/// <summary>行数量(y轴上排列几个)</summary>
private int rowCount;
//数据容器
//private List<object> __dataList = new List<object>();
private List<T> __dataList = new List<T>();
//开始数据下标
private int __startIndex = 0;
//节点池列表
private List<ItemControll> __releaseList = new List<ItemControll>();
private List<ItemControll> __activeList = new List<ItemControll>();
//添加数据
public void Add( T data)
{
__dataList.Add(data);
//刷新视图
RefreshContentSize();
RefreshContent();
}
public void AddRange(T[] datas)
{
__dataList.AddRange(datas);
//刷新视图
RefreshContentSize();
RefreshContent();
}
//移除数据
public void Remove(params T[] datas)
{
foreach (var data in datas)
{
__dataList.Remove(data);
}
//刷新视图
RefreshContentSize();
RefreshContent();
}
//清空数据
public void Clear()
{
__dataList.Clear();
//刷新视图
RefreshContentSize();
RefreshContent();
}
//设置间隔
public void SetSpacingWidth(float width)
{
if (spacingWidth != width)
{
spacingWidth = width;
//刷新视图
RefreshContentSize();