前言
在開發中,有時候我們回到這樣一種需求:從乙個豎屏介面跳轉到下乙個橫屏介面,或者反之。如果是安卓的話,就很簡單,安卓系統提供這樣的api,直接操作即可。但是ios就不好辦了,在ios3.0之前,系統還有乙個介面用來設定應用螢幕方向setorientation:,但是ios3.0之後就被禁止了,成為了私有方法(也不知道蘋果怎麼想的)。
本文針對這個問題展開討論,並提供解決方案,以及此方案帶來的坑和填坑方案(最重要的乙個就是鍵盤彈出方向問題)。
唯一解決辦法
ios中不能直接設定介面方向,那就只能對檢視進行手動旋轉了,view.transform。
例如view需要順時針旋轉90度:
view.transform = cgaffinetransformmakerotation(m_pi_2);
狀態列也要跟著旋轉
如果狀態列沒有隱藏的話,那麼狀態列也要旋轉一下,不旋轉的話產品是不會放過你的
所以這段**和上面的**一般是同時出現的。
鍵盤彈出方向是個頭疼的問題
不同的應用,介面結構也不盡相同,純原生開發也有可能多個window疊層。如果是在cocos2d上開發的遊戲應用,那就會再麻煩點。首先說明幾個注意點,大家靈活運用。運用不好,就會出現如圖現象:
ios應用中,決定鍵盤的方向因素在不同ios版本中是不一樣的。
ios7中,鍵盤方向是根據狀態列方向決定的。
ios9中,鍵盤方向由最後一層window決定,這裡有點複雜,因為ios9新增了乙個uiremotekeyboardwindow。那麼應用可能就有3個window,依次是uiwindow,uitexteffectswindow,uiremotekeyboardwindow。uiremotekeyboardwindow成為決定鍵盤方向的window了,而uitexteffectswindow控制了鍵盤頂部欄的方向,如下如:
ios10中,和ios9類似,但是,如果要強制旋轉鍵盤的話,它的座標計算方法又和之前的系統有區別。區別在於計算window的原點座標(x,y),ios10是(0,0,width,height),ios9的x和y需要這樣計算:cgfloat keyboardwindowxy = (viewsize.height - viewsize.width) / 2;
在這種橫豎屏頻繁切換的應用中,很容易出現上圖中所示的情況,或者在橫屏介面中鍵盤縱向彈出。那麼這個時候就需要手動旋轉控制鍵盤方向的window啦。
鍵盤強制旋轉
如果是純原生開發,只需要旋轉決定鍵盤方向的window,設定bounds,設定center。旋轉**如下:
if(windowcount < 2) {
return;
if(windowcount == 3)//ios9以上,uiremotekeyboardwindow
keyboardwindow.bounds =cgrectmake(0, 0, [[uiscreen mainscreen] bounds].size.width, [[uiscreen mainscreen] bounds].size.height);
keyboardwindow.center = cgpointmake([[uiscreen mainscreen] bounds].size.width*0.5f,[[uiscreen mainscreen] bounds].size.height*0.5f);
keyboardwindow.transform = cgaffinetransformmakerotation(0);
keyboardwindow.bounds =cgrectmake(0, 0, [[uiscreen mainscreen] bounds].size.width, [[uiscreen mainscreen] bounds].size.height);
keyboardwindow.center = cgpointmake([[uiscreen mainscreen] bounds].size.width*0.5f,[[uiscreen mainscreen] bounds].size.height*0.5f);
keyboardwindow.transform = cgaffinetransformmakerotation(0);
經過以上操作,螢幕旋轉和鍵盤旋轉基本上就可以得到解決了。
但是我參與的專案還不止這麼簡單,它是基於cocos2dx的應用,還會跳轉原生頁面,橫屏遊戲介面跳入豎屏原生介面。這個時候得改一些cocos2dx的**,去強制扭轉鍵盤,座標計算和各種情況的判斷,還是挺複雜的,本文就不再做詳細介紹,因為別的專案涉及到的概率非常小。
以上討論僅供參考,希望對您有所幫助。
另一種鍵盤旋轉方法
[[uidevice currentdevice] setvalue:[nsnumber numberwithinteger:uideviceorientationlandscapeleft] forkey:@"orientation"];
在ios8以上的系統中,鍵盤卻隨著裝置方向彈出了。換言之,即使inte***ce orientation為landscape,但device orientation為portrait,鍵盤就會以portrait的方向彈出。但是setvalue是個私有方法
iOS強制橫屏
在網上查了很多資料均不能獲取自己想要的效果,最後整理了別人的思路,方法,再花了一天的工作量填坑,成功實現了想要的功能和效果,嗯,完美!原因就是坑少囉!廢話太多直接進入正題!第一步 uiinte ceorientationmask uiwindow window中新增以下 nsuserdefaults...
iOS中強制轉某個頁面為橫屏,鍵盤也橫屏
我專案中全部是豎屏,但是有那麼幾個是橫屏,也有幾個是橫屏中要輸入一些資訊,然後就要使得鍵盤也是橫屏。1 設定專案的device landscape中的資訊,要勾選這麼幾項,如下 2 設定強制橫屏 在viewdidload方法裡面新增如下 void viewdidload val uiinte ceo...
iOS 強制轉成橫屏的方式
手裡的專案需要在豎屏的情況下有個別頁面進行橫屏強制切換,困擾了一天終於找到解決的辦法。辦法由如下兩個 1 手動改變view.transform屬性 簡明的說就是旋轉你的view,將view旋轉後強迫使用者進行橫屏操作 self.view.frame cgrectmake 0,0,uiscreen m...