iOS開發:自動旋轉與調整大小

蘋果的產品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);
    }
}

⑦ 運行,查看效果:

四、小結

此次講了實現自動旋轉調整大小的三種方法,第一種只要點點鼠標,很簡單,但不適合複雜的視圖;第二種要從新設置控件的大小和位置,代碼量會比較大;第三種是建立兩種視圖,旋轉時調用不一樣的視圖,比較適合複雜的視圖。

相關文章
相關標籤/搜索