NGUI UIStretch自适应时 ScrollView使用panel滑动时出现问题的解决方案

目前做的手机游戏项目使用的是UIStretch做分辨率自适应,里面又恰好用到ScrollView,于是对照NGUI的例子7,在UNITY的固定分辨率下做了一个竖直拖动的ScrollView,而且Scrollview的宽度和屏幕宽度并不一致,电脑上切换分辨率测试时都很正常,但是在真机上测试时却出现了问题,其中2台机器,相同的1920x1080分辨率,一个的ScrollView功能完全正常,但屏幕中包含虚拟按键,另一个的ScrollView拖动后就突然消失了,当时就纳闷为什么电脑上都是正常的,后来才发现,电脑上固定分辨率下正常,但是如果把分辨率调成"free Aspect"就会出现和真机上一样的问题。


在网上查找解决方案,发现是因为NGUI自身分辨率自适应需求导致的。如果要使用例子7的ScrollView(panel),就不能用UIStretch来进行自适应,并且所有panel的中scale也要一致才可以;如果使用UIStretch自适应,估计就要换成例子8的ScrollView(camera)了。


相关自适应的资料收藏:1. http://blog.csdn.net/lzhq1982/article/details/18814023

                                            2.http://www.cnitblog.com/updraft/archive/2013/11/12/88801.html


后来为了解决这个问题,在网上查找到了这个方法:http://blog.csdn.net/nateyang/article/details/8518276


但是在试了之后发现仍然有些问题,使用方法1后,ScrollView的拖动是正常了,但是其宽度显示却又出了问题,貌似都被裁剪了,要比正常情况下的窄,而且根据方法作者所描述的,竖直ScrollView时填写的size应为发布时设备的Screen.Height,但是无论我如何设置,ScrollView的宽度仍然无法显示完整;使用方法2后,拖动问题仍然存在,没有任何改变。


此路不通,只能通过其他方法解决。根据方法作者的描述,并逐行阅读其代码,明白了ScrollView中panel的缩放是依据UIStretch自适应时相关panel的scale大小进行的。而且在逐行打log测试其数值的过程中发现,该方法中的Screen.width和Screen.height的值并不是手机屏幕的值,只是你这个Scrollview中的panel的宽高,而我所做的项目是根据800x1280分辨率开发的,通过缩放来自适应,ScrollView中panel的宽高在这个基本分辨率下也是固定的非全屏的,此时panel的scale值均为1。

此时我就想,在使用这个方法后,因scale的缩放,ScrollView的宽度变窄了,如果根据这个缩放值,把此时ScrollView的宽度变长些,是否会显示正常呢?通过运行这个方法发现缩放的只是scale的x轴,x轴的值通过transform.localScale.x获取,而这个值必须在该方法执行以下代码后获取才正常:

	transform.localScale = new Vector4(ScaleSize, ScaleSize, ScaleSize, ScaleSize);
        transform.parent = parent;
        child.parent = transform;
因此我对该方法的最后一句做了以下修改,将

PanelScript.baseClipRegion = new Vector4(PanelScript.finalClipRegion.x, PanelScript.finalClipRegion.y, PanelScript.finalClipRegion.z * rateX, PanelScript.finalClipRegion.w * rateY);
改为

PanelScript.baseClipRegion = new Vector4(PanelScript.finalClipRegion.x, PanelScript.finalClipRegion.y, size / transform.localScale.x, PanelScript.finalClipRegion.w * rateY);
其中,size是基础分辨率下ScrollView中panel的宽度,并不是屏幕宽度。原代码对clip值的获取已经过时,因此将原来的ClipRegion替换成了 finalClipRegion和 baseClipRegion ,finalclipRegion为只读的。finalclipRegion的x、y、z、w分别表示UIPanel中clipping的position(XY)和size(ZW)。经过测试,ScrollView宽度显示正常,分辨率自适应正常。


NGUI版本号3.6.1


突然发现一件事,我的ScrollView是竖直的,所以我直接改的是clipRegion中z的值,即ScrollView中panel所显示的size的x值,如果ScrollView是水平的话,则需要自己改下clipRegion的y的值。





                             

你可能感兴趣的:(NGUI)