蘋果的產品iPad和iPhone都是支持自動旋轉的,於是咱們寫的程序也要支持兩種視圖:縱向和橫向。ide
默認狀況下,咱們寫的程序都是縱向的,就像前邊的幾個例子中那樣。若是運行之前寫的程序,當把模擬器旋轉,你會發現很不友好,有的控件看不見了。這個時候,自動旋轉就顯得頗有必要了。佈局
一、咱們先不談如何實現自動旋轉,先講講如何讓程序知道它支持哪幾種旋轉。spa
運行Xcode 4.2,新建一個Single View Application,程序名爲RotateTest,其餘設置以下圖:設計
建立好工程後,打開的第一個頁面包含以下視圖:3d
咱們能夠在這裏設置程序支持哪一種旋轉,只需選中那個按鈕。從上圖能夠看出,默認狀況下,iPhone程序不支持倒過來的旋轉,由於若是視圖是倒過來 的,而此時忽然來電話,那麼會很不方便,由於頁面依然是倒過來的。可是,若是你建立了一個iPad程序,你回發現上圖四個按鈕都是選中的,即iPad程序 默認支持全部旋轉。code
注意,若是爲程序建立了多個View Controller,那麼每一個View Controller都要能夠設置所支持的旋轉,不過,新建的View Controller設置的值必須是主View Controller的子集。orm
其實,咱們修改上圖中的按鈕,實質上修改的是咱們程序的plist文件,在這個工程中,是RotateTest-Info.plist文件,以下圖,展開這個文件,最下面顯示的就是所支持的旋轉:get
上面是設置支持選中的一種方法。咱們也能夠在代碼中設定所支持的旋轉。打開ViewController.m,找到shouldAutorotateToInterfaceOrientation方法,完整代碼以下:虛擬機
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); }
上面的代碼代表,不支持倒轉(UIInterfaceOrientationPortraitUpsideDown)。頁面佈局
iOS中定義了四個表示方向的變量:
UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
若是iOS設置旋轉了,程序就會調用這個方向,若是返回YES就旋轉視圖,不然的話就不旋轉。若是你創建了一個iPad程序,這個方法就是簡單的返回YES。
二、既然咱們已經讓程序知道支持什麼旋轉了,下面講講如何實現。
在iOS中有三種方法能夠實現自動旋轉。
(1)最簡單的方法就是利用Xcode中的Size Inpector:
(2)在View所對應的ViewController.m中重寫willAnimateRotationToInterfaceOrientation方法,在這個方法中從新設置控件的大小與位置。
(3)再新建一個視圖,這樣,咱們有兩個視圖了,一個縱向,一個橫向。在這兩個視圖上設計好了以後,當旋轉時根據旋轉方向,調用相應的視圖。
三、如下是這三個方法的簡單使用。
3.1 使用Size Inpector實現自動旋轉:
① 單擊ViewController.xib,在打開的視圖區域拖放兩個Button在上面,分別命名爲「按鈕上」和「按鈕下」,頁面佈局以下圖:
圖中兩個按鈕在水平方向上是居中放置的。
② 運行程序,並將模擬器旋轉,對比一下旋轉先後的效果:
旋轉以後,「按鈕下」不見了。不過,「按鈕上」的座標和大小實際上是沒變的。
我如今想實現旋轉以後兩個按鈕仍是水平方向居中,而且仍是一個在頂端、一個在底端。爲實現這個,我要作如下工做:
③ 在View中選中「按鈕上」,打開Size Inspector,把左邊的紅實線改爲虛線:
④ 在View中選中「按鈕下」,打開Size Inspector,把左邊和上邊的紅實線改爲虛線,下邊的紅虛線改爲實線:
外圍的紅實線表示距離不變,例如上圖右中下方的紅實線就表示對應的控件與下方的距離不變,而其餘方向會自動調整。如今運行一下並旋轉模擬器,看看效果:
3.2 重寫willAnimateRotationToInterfaceOrientation方法,從新設置控件的大小與位置
① 首先先給這兩個按鈕添加Outlet映射到ViewController.h,名稱分別是button_1和button_2:
② 在ViewController.m中的@end以前添加如下代碼:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval) duration { if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) { button_1.frame = CGRectMake(124, 20, 72, 37); button_2.frame = CGRectMake(124, 403, 72, 37); } else { button_1.frame = CGRectMake(20, 131, 72, 37); button_2.frame = CGRectMake(388, 131, 72, 37); } }
③ 運行,看看效果:
3.3 建立新視圖,旋轉時切換視圖:
① 咱們先建立原始視圖的副本,可是仍是在原來的ViewController中。單擊ViewController.xib,打開IB,在左邊的三個圖標中 選中View圖標,若是用的是Mac Book,那麼按住Control鍵,若是是虛擬機,請按住Alt鍵。按住後按住鼠標左鍵,往下拖,鼠標會變成綠色的加號。注意新視圖跟原始圖是並列的, 因此你要往正確的方向拖,而後鬆開鼠標,這樣就建立了原來視圖的副本:
② 調整新視圖爲橫向(Landscape):
選中新視圖,打開Attribute Inspector,在Orientation中選擇Landscape:
③ 調整新視圖中的按鈕的位置,你能夠按照本身的喜愛設置,這裏設置成以下所示:
④ 下面,咱們爲這兩個View創建Outlet映射,注意是View,而不是View上的控件。創建映射的方法都是同樣,兩個名稱分別是portrait和landscape:
⑤ 單擊ViewController.m,在@implementation那行代碼的下一行添加如下語句:
#define degreesToRadians(x) (M_PI*(x)/180.0)
⑥ 修改willAnimateRotationToInterfaceOrientation方法,以下:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { self.view = self.portrait; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(0)); self.view.bounds = CGRectMake(0.0, 0.0, 320.0, 460.0); } else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { self.view = self.landscape; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90)); self.view.bounds = CGRectMake(0.0, 0.0, 480.0, 300.0); } else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { self.view = self.landscape; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90)); self.view.bounds = CGRectMake(0.0, 0.0, 480.0, 300.0); } }
⑦ 運行,查看效果:
四、小結
此次講了實現自動旋轉調整大小的三種方法,第一種只要點點鼠標,很簡單,但不適合複雜的視圖;第二種要從新設置控件的大小和位置,代碼量會比較大;第三種是建立兩種視圖,旋轉時調用不一樣的視圖,比較適合複雜的視圖。