UIGrid的CustomSort使用

今天碰到个需求是为一个UIGrid实现一个自定义排序。

实现的话有2种方式,第一可以在将数据生成界面之前,排好序,然后传递给界面,生成出来的就是已经排好序的。这种实现方式比较自由,对多种数据结构可以自定义实现,比如说LINQ,List等等都可以实现。网页上搜索到的基本也都可以实现这种排序。HERE

第二可以使用NGUI提供的接口。OnCustomerSort。

NGUI的自定义排序的原理剖析:

List<Transform> list = new List<Transform>();

UIGrid内部使用的数据结构是List<Transform>。

     // Sort the list using the desired sorting logic
        if (sorting != Sorting.None && arrangement != Arrangement.CellSnap)
        {
            if (sorting == Sorting.Alphabetic) list.Sort(SortByName);
            else if (sorting == Sorting.Horizontal) list.Sort(SortHorizontal);
            else if (sorting == Sorting.Vertical) list.Sort(SortVertical);
            else if (onCustomSort != null) list.Sort(onCustomSort);
            else Sort(list);
        }

使用的排序的核心代码如上,其实就是list的排序(如上)。依据不同的排序类型调用不同的方法。

   /// <summary>
    /// Custom sort delegate, used when the sorting method is set to 'custom'.
    /// </summary>

    public System.Comparison<Transform> onCustomSort;

onCustomSort是一个transform类型实现了比较接口的委托。

SO,其实UIGrid就是使用了list的这个接口(上图)的排序。然后使用委托将接口暴露出来。

实现:1.将UIGrid的排序类型设置成custom。

2.添加委托的方法:

Grid.onCustomSort += customSort;

3.实现委托的方法:

int customSort(Transform left, Transform right){}

 委托中传入的参数是transfrom,可以直接调用GetComponent来获得组件来进行比较。

最后说一下写的时候遇到的一个坑:接口返回的是int。大于:正数,等于:0,小于:负数。敲代码的时候考虑,其实只需要保证2种,然后写出了 return left>right?1:-1; 

的代码,之后结果一直不正确。仔细思考之发现,等于这种状态其实不能省略。如上的代码如果是相等的2个都会返回-1,导致了结果不对。

posted on 2016-11-28 19:43  知微出凡  阅读(1105)  评论(0编辑  收藏  举报

导航