以编程方式从GridLayoutGroup获取列数和行数

时间:2018-09-16 11:58:49

标签: c# unity3d

我有一个带有GridLayoutGroup的面板。 约束设置为“灵活”,因此它在行和列中都没有固定,我不希望这样。

现在,我想在代码中获取此GridLayout的列数,然后更改单元格的大小以适合屏幕。

enter image description here

 GridLayoutGroup layoutgroup;

我的代码中有GridLayoutGroup变量,但是没有获取其列的函数。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您必须手动循环计数。您可以通过执行以下操作从GridLayoutGroup组件中获取列数和行数:

1 。获取对象的第一个子对象在GridLayoutGroup对象下的位置。该位置应来自RectTransform.anchoredPosition,该位置返回Vector2

2 。从第二个子对象到GridLayoutGroup的其他子对象中循环。

3 。在来自#2 的每个循环中,将第一个孩子的x组件与当前循环中的x组件进行比较

在循环外创建一个布尔变量,该布尔变量确定何时停止对行进行计数。故障值应为false

如果x值匹配,则为,因此将列增加1,然后将布尔变量设置为true

如果x的值不相同,并且布尔变量为false,则它是,因此将行增加1。 / p>

基本上,当在循环中找到列时,您将停止对行进行计数或递增。这就是布尔变量的用途。

void GetColumnAndRow(GridLayoutGroup glg, out int column, out int row)
{
    column = 0;
    row = 0;

    if (glg.transform.childCount == 0)
        return;

    //Column and row are now 1
    column = 1;
    row = 1;

    //Get the first child GameObject of the GridLayoutGroup
    RectTransform firstChildObj = glg.transform.
        GetChild(0).GetComponent<RectTransform>();

    Vector2 firstChildPos = firstChildObj.anchoredPosition;
    bool stopCountingRow = false;

    //Loop through the rest of the child object
    for (int i = 1; i < glg.transform.childCount; i++)
    {
        //Get the next child
        RectTransform currentChildObj = glg.transform.
       GetChild(i).GetComponent<RectTransform>();

        Vector2 currentChildPos = currentChildObj.anchoredPosition;

        //if first child.x == otherchild.x, it is a column, ele it's a row
        if (firstChildPos.x == currentChildPos.x)
        {
            column++;
            //Stop couting row once we find column
            stopCountingRow = true;
        }
        else
        {
            if (!stopCountingRow)
                row++;
        }
    }
}

用法:

public GridLayoutGroup gridLG;

void Update()
{
    int column = 0;
    int row = 0;
    GetColumnAndRow(gridLG, out column, out row);
    Debug.Log("Column: " + column + "   Row: " + row);
}

答案 1 :(得分:0)

您也可以使用子项的localPosition来做到这一点。

class DeclarationNameCustom : public DeclarationName {
    std::string prefix;
public:
    DeclarationNameCustom(DeclarationName& DN, std::string prefix) : prefix(prefix), DeclarationName(DN) {

    }
    void print(raw_ostream* OS, const PrintingPolicy& policy) const override {
        std::string s;
        raw_string_ostream rso(s);
        DeclarationName::print(rso, policy);
        std::string dummy = prefix + rso.str();
        OS->write(dummy.c_str(), dummy.size());
    }
};