新聞中心
Cocos2d各種視圖轉(zhuǎn)換情況分析在本文介紹的內(nèi)容,關(guān)于cocos2d下的屏幕旋轉(zhuǎn),大家都熟悉在cocos2d里,如果要設(shè)置為橫屏的話,只要在attachView之前調(diào)用以下函數(shù)就可以了。

創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)10余年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)營(yíng)銷(xiāo)推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都橡塑保溫等企業(yè),備受客戶贊譽(yù)。
- [[CCDirector sharedDirector] setDeviceOrientation:CCDeviceOrientationLandscapeLeft];
但在實(shí)際開(kāi)發(fā)中,我們往往還會(huì)有以下一些問(wèn)題 自動(dòng)屏幕旋轉(zhuǎn)處理 在cocos2d里加入U(xiǎn)IView cocos2d attach的不是NSWindow而是其他Subview 遇到這些問(wèn)題,你會(huì)發(fā)現(xiàn)事情并不像你預(yù)料的那么簡(jiǎn)單直接。要解決這些問(wèn)題,我們先要了解一下iPhone的屏幕旋轉(zhuǎn)到底是如何處理的。
首先,iPhone上的每個(gè)View代表一個(gè)圖層,每個(gè)圖層有它的坐標(biāo)系統(tǒng)。拿iPhone為例,在豎屏狀態(tài)下UIView的坐標(biāo)系是高480寬320的系統(tǒng)。而在橫屏狀態(tài)下,如果已經(jīng)處理好屏幕旋轉(zhuǎn)的情況下,它的坐標(biāo)系統(tǒng)就應(yīng)該是高320寬480. 這個(gè)大家在使用UIViewController的時(shí)候,得到的結(jié)果是顯而易見(jiàn)的。但當(dāng)你直接自己創(chuàng)建一個(gè)UIView并加入到NSWindow下,你會(huì)發(fā)現(xiàn)不管豎屏橫屏,這個(gè)view還是豎屏的狀態(tài)。
如果你獲取一下NSWindow或者您自己View的bounds,你會(huì)得到320x480二不是480 x 320. 這是怎么回事呢?仔細(xì)想一下我們就明白了。UIViewController提供了一個(gè)方法可以讓我們告訴它是否選擇其管理的UIView,而NSWindow或者UIApplication都沒(méi)有提供類(lèi)似的方法。也就是說(shuō)屏幕的旋轉(zhuǎn)處理是需要View的控制者通過(guò)監(jiān)聽(tīng)設(shè)備旋轉(zhuǎn)事件來(lái)自行處理的,而UIViewController就提供了類(lèi)似的實(shí)現(xiàn),從而使你不需要對(duì)view進(jìn)行任何操作也能隨屏幕旋轉(zhuǎn)。
而如果你是自己創(chuàng)建View而沒(méi)有附著于任何ViewController的話,你就需要自己監(jiān)聽(tīng)屏幕旋轉(zhuǎn)事件了。那怎么實(shí)現(xiàn)View的旋轉(zhuǎn)呢?每個(gè)UIView都有一個(gè)transform屬性,這個(gè)屬性決定了對(duì)View的默認(rèn)坐標(biāo)系統(tǒng)所做的坐標(biāo)轉(zhuǎn)換,所以實(shí)際上transform其實(shí)就是一個(gè)三維矩陣,用于換算一個(gè)點(diǎn)在前后兩個(gè)坐標(biāo)系的坐標(biāo)(因?yàn)閛pengl是一個(gè)三維系統(tǒng),所以是三維坐標(biāo))。默認(rèn)坐標(biāo)系是以View的中心為原點(diǎn),View的寬為橫軸,高為縱軸。
當(dāng)然這個(gè)系統(tǒng)是以它的superView為參照系的。如果superView的坐標(biāo)系是豎屏坐標(biāo),則該view的默認(rèn)坐標(biāo)系就是豎屏坐標(biāo),如果superView的坐標(biāo)系是橫屏坐標(biāo),則該view的默認(rèn)坐標(biāo)系就是橫屏坐標(biāo)。以下就以對(duì)NSWindow的一個(gè)subview所做的坐標(biāo)轉(zhuǎn)換來(lái)看一下怎么通過(guò)設(shè)置transform來(lái)改變View的視圖朝向(之所以選擇NSWindow的subview,是因?yàn)镹SWindow在系統(tǒng)中是一直不會(huì)做transform的,如果你拿一個(gè)UIViewController的view的subview來(lái)做transform,以下代碼就不準(zhǔn)確了)。
- CGFloat radian = 0;
- CGRect bounds; switch ([UIApplication sharedApplication].statusBarOrientation)
- {
- case UIInterfaceOrientationPortrait: break;
- case UIInterfaceOrientationPortraitUpsideDown: radian = PI;
- break; case UIInterfaceOrientationLandscapeLeft: radian = -PI/2;
- bounds.size = CGSizeMake(480, 320);
- break;
- case UIInterfaceOrientationLandscapeRight:
- radian = PI/2;
- bounds.size = CGSizeMake(480, 320);
- break;
- default: break;
- }
- //設(shè)置transform變量,以當(dāng)前view的center為中心
- //CGAffineTransformMakeRotation可以生成對(duì)當(dāng)前坐標(biāo)系做旋轉(zhuǎn)處理的transform矩陣,
- //旋轉(zhuǎn)角度是逆時(shí)針的radion,其中radion是該角度的弧度值。
- CGAffineTransform transform = CGAffineTransformMakeRotation(radian);
- _contentView.transform = transform; //重新設(shè)置view的大小
- _contentView.bounds = bounds;
現(xiàn)在我們?cè)倩貋?lái)看前面提到的cocos2d的幾個(gè)問(wèn)題。
1、自動(dòng)旋轉(zhuǎn)處理 默認(rèn)的cocos2d程序都是把cocos2d 的openglview attache到NSWindow里,這種情況下你就需要自己監(jiān)聽(tīng)UIDeviceOrientationDidChangeNotification事件, 在設(shè)備旋轉(zhuǎn)情況下來(lái)重新配置cocos2d。(不要監(jiān)聽(tīng)UIApplicationDidChangeStatusBarOrientationNotification或者UIApplication的相應(yīng)delegate, setDeviceOrientation:CCDeviceOrientationLandscapeLeft本身會(huì)觸發(fā)這些事件)。
在監(jiān)聽(tīng)處理函數(shù)里一般需要做以下事情,
- [[CCDirector sharedDirector] detach]; //重新設(shè)置設(shè)備旋轉(zhuǎn)方向
- [[CCDirector sharedDirector] setDeviceOrientation:CCDeviceOrientationLandscapeLeft];
- //重新attach到view [[CCDirector sharedDirector] attachInView:NSWindow];
- //重新布局當(dāng)前的scene
- //這里沒(méi)有現(xiàn)成的方法,你可以自己實(shí)現(xiàn)。
如果你的程序是把cocos2d openglview附著到某個(gè)ViewController的view里的話,情況就不一樣了. 因?yàn)閂iewController是支持自動(dòng)屏幕旋轉(zhuǎn)的。如果你讓ViewController來(lái)處理屏幕旋轉(zhuǎn)(比如你還要顯示navigation bar),你就不能調(diào)用[[CCDirector sharedDirector] setDeviceOrientation:...]方法了。
原因大家可以自己想想。***你需要做的就是處理屏幕旋轉(zhuǎn)時(shí)scene的重新布局。所以代碼就簡(jiǎn)化為如此,
- [[CCDirector sharedDirector] detach]; //重新attach到view
- [[CCDirector sharedDirector] attachInView:NSWindow]; //重新布局當(dāng)前的scene
- //這里沒(méi)有現(xiàn)成的方法,你可以自己實(shí)現(xiàn)。
2、在cocos2d里加入U(xiǎn)IView 這種情況和在NSWindow里加入U(xiǎn)IView很類(lèi)似,如果你是自己創(chuàng)建的view,則需要自己設(shè)置view的坐標(biāo)轉(zhuǎn)換。如果你的view被viewcontroller管理著,則不需要自行處理。
3、cocos2d attach的不是NSWindow而是其他Subview 這種情況在1里面其實(shí)已經(jīng)提到了,如果你要附著的View是被UIViewController管理并且你允許該Controller做屏幕旋轉(zhuǎn)處理,你則不能調(diào)用[[CCDirector sharedDirector] setDeviceOrientation:...]方法,否則你會(huì)發(fā)現(xiàn)視圖多旋轉(zhuǎn)了一次。
小結(jié):關(guān)于Cocos2d各種視圖轉(zhuǎn)換情況分析的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!
本文題目:關(guān)于Cocos2d各種視圖轉(zhuǎn)換情況分析
分享地址:http://fisionsoft.com.cn/article/cosjgdp.html


咨詢(xún)
建站咨詢(xún)
