NGUI 动态向grid里添加项没有裁剪问题的解决方案

补充一点这里说的动态生成的控件是指UIlabel,uitexture之类的UI控件,如果往grid里动态添加预设体是没有问题的即使预设体里会有这些UI控件也是没问题的    

出现这个问题的原因很简单,不是没有裁剪而是grid里动态添加的项的panel找错了,所以不受grid的panel的控制,具体代码如下

public void CreatePanel (bool addToPanel = true)
{
        ......
        while (trans != null && mPanel == null)
            {
                UIPanel.uipanels.TryGetValue(trans, out mPanel);
                trans = trans.parent;
            }
            if (mPanel == null)
            {
#if UNITY_EDITOR
                Debug.Log("fuck!!", this);
#endif
                mPanel = gameObject.AddComponent<UIPanel>();
            }
        ......
}

这是UIWidget里的CreatePanel()方法

void OnEnable ()
    {
       ......
	    uipanels.Add(cachedTransform, this);
    }

这是UIPanelOnEnable()方法,uipanels是一个存储着UIPanel的键值对,ui控件就是从这里面查找自己的panel,具体看上面的CreatePanel()方法,如果没有找到自己身上的UIPanel就会找父物体依次往上找知道找到,如果最后还没找到就添加一个UIPanel

言归正传.解决动态向grid里添加项没有裁剪问题的方法很简单,就是先让UIPanelOnEnable()方法执行,再动态向grid里添加控件,因为执行顺序问题,往grid里动态添加完控件后会先调用CreatePanel()方法,也就是说如果你在OnEnable()方法中往grid里添加控件,那么会先执行CreatePanel()方法,再执行UIPanelOnEnable()方法,所以添加的组件就会找到grid父物体的panel而不是grid的panel,而如果grid里的控件不是动态生成的而是才开始搭建的时候就有的,就不会出现这个问题

说了这么多,解决方法有很多只要延迟调用一下动态创建方法就可以,我是用了一个协程延迟了0秒,问题就完美解决了

猜你喜欢

转载自blog.csdn.net/Marccco/article/details/85115036