因爲我常常時間一長就忘記,到要用的時候又要查,又要摸索,很浪費時間,因此寫下這篇文章。html
scrollview就是一個能上下或者左右拖動的ui列表,揹包、展現多個按鈕等狀況的時候會用到。算法
要組成一個完整能用的ScrollView,須要如下幾個組件:ui
scroll rect、 mask、各類layout。大體ui層級結構以下:spa
先說說scroll rect ,這個東西是位於最上面父節點的組件 content屬性下的物體是方各類item的;horizontal和vertical是各類垂直橫行拖動;viewprot顯示item的框,須要有mask組件。3d
而後是content,它下面放各類item一、二、三、4...,想要讓它能自動排列item項,須要有下面那三個組件,選一個就好(這些組件的裏面有些默認選項,強烈建議勾都去掉)code
自動生成的物體item放在content節點下。orm
content的大小適不適中,關係到最後的拖動效果。太大的話最後結果會有剩餘的空餘地方,很很差看;過小的話最後結果可能會形成不管怎麼拖動,都看不到全部的item項。htm
爲了應對上述所說的狀況,咱們要對content物體的rect transform控件進行設置,如下以Vertical layout Group形式進行代碼示例(在這以前,content的豎向大小要設置成最小):blog
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的寬度來算。get
想要知道設置rect transform大小的其餘屬性的方法在另外一篇文章裏,連接:https://www.cnblogs.com/Transmuter/articles/11077520.html