由于我经常时间一长就忘记,到要用的时候又要查,又要摸索,很浪费时间,所以写下这篇文章。
scrollview就是一个能上下或者左右拖动的ui列表,背包、展示多个按钮等情况的时候会用到。
要组成一个完整能用的ScrollView,需要以下几个组件:
scroll rect、 mask、各种layout。大致ui层级结构如下:
先说说scroll rect ,这个东西是位于最上面父节点的组件 content属性下的物体是方各种item的;horizontal和vertical是各种垂直横行拖动;viewprot显示item的框,需要有mask组件。
然后是content,它下面放各种item1、2、3、4...,想要让它能自动排列item项,需要有下面那三个组件,选一个就好(这些组件的里面有些默认选项,强烈建议勾都去掉)
自动生成的物体item放在content节点下。
content的大小适不适中,关系到最后的拖动效果。太大的话最后结果会有剩余的空余地方,很不好看;太小的话最后结果可能会造成无论怎么拖动,都看不到所有的item项。
为了应对上述所说的情况,我们要对content物体的rect transform控件进行设置,以下以Vertical layout Group形式进行代码示例(在这之前,content的竖向大小要设置成最小):
for (int i = 1; i < content.transform.childCount; i++)//除了第0个样本item,其他都要删除(如果要多次在这个content下重新生成item的话) { Destroy(content.transform.GetChild(i).gameObject); } RectTransform rect = content.GetComponent<RectTransform>();//获取content的rect transform组件 Dictionary<string, string>.Enumerator it = dic.GetEnumerator();//假设dic是从某某配置表获取的item具体配置 int index = 0; while (it.MoveNext()) { GameObject btn_item = Instantiate(item.gameObject); btn_item.transform.SetParent(content.transform);//一定要先设置父物体,不然生成的item的尺寸会令人蛋疼 btn_item.transform.localScale = item.transform.localScale; btn_item.gameObject.SetActive(true);//item本身默认隐藏 index++; float btn_rect = btn_item.GetComponent<RectTransform>().rect.height;//获取单个按钮的高度 rect.offsetMin = new Vector2(rect.offsetMin.x, -1 * btn_rect * index);//对content的高度进行修改,往下要乘-1 }
这样就能让content获得合适的大小了。如果使用gridlayout的话算法要变一下,要根据item和content的宽度来算。
想要知道设置rect transform大小的其他属性的方法在另一篇文章里,链接:https://www.cnblogs.com/Transmuter/articles/11077520.html