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

本文详细解析了在Unity中动态向Grid布局添加UI控件时遇到的裁剪问题,指出原因是UI控件错误地查找了其所属的UIPanel。通过调整UIPanel的OnEnable方法执行时机,确保UI控件正确关联至Grid的UIPanel,从而实现正确的裁剪效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

这是UIWidget里的CreatePanel()方法:

public void CreatePanel (bool addToPanel = true)
{
        ......
        while (trans != null && mPanel == null)
            {
                UIPanel.uipanels.TryGetValue(trans, out mPanel);
                trans = trans.parent;
            }
            if (mPanel == null)
            {
                mPanel = gameObject.AddComponent<UIPanel>();
            }
        ......
}

这是UIWidget的Start()方法:

    void Start ()
	{
		...
		CreatePanel();
	    ...
	}

这是UIPanelOnEnable()方法:

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

这是UIPanelOnDisable()方法:

void OnDisable ()
{
    ...
    uipanels.Remove(cachedTransform);
    ...
}

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值