补充一点这里说的动态生成的控件是指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);
}
这是UIPanel的OnEnable()方法,uipanels是一个存储着UIPanel的键值对,ui控件就是从这里面查找自己的panel,具体看上面的CreatePanel()方法,如果没有找到自己身上的UIPanel就会找父物体依次往上找知道找到,如果最后还没找到就添加一个UIPanel
言归正传.解决动态向grid里添加项没有裁剪问题的方法很简单,就是先让UIPanel的OnEnable()方法执行,再动态向grid里添加控件,因为执行顺序问题,往grid里动态添加完控件后会先调用CreatePanel()方法,也就是说如果你在OnEnable()方法中往grid里添加控件,那么会先执行CreatePanel()方法,再执行UIPanel的OnEnable()方法,所以添加的组件就会找到grid父物体的panel而不是grid的panel,而如果grid里的控件不是动态生成的而是才开始搭建的时候就有的,就不会出现这个问题
说了这么多,解决方法有很多只要延迟调用一下动态创建方法就可以,我是用了一个协程延迟了0秒,问题就完美解决了