2011-03-23 120 views
1

所以我建立我的應用程序旋轉,和我已經設置了所有的按鈕翻譯使用下面的方法手動:兩個筆尖,相同的對象(iPhone)

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)x 
            duration:(NSTimeInterval)duration{ 

CGRect bounds = [[self view] bounds]; 

if (UIInterfaceOrientationIsPortrait(x)) { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 194)]; 
} 
else { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 110)]; 
} 

} 

我設置了各對象在兩個方向上的位置。這似乎是一個可怕的方式來完成我的目標..

所以現在我想要做的是複製我的主要筆尖,並設置所有按鈕的位置在新的筆尖風景。然後當設備旋轉時,調用相應的筆尖。這是可行的/可行的/一個好方法嗎?

我該如何調用筆尖旋轉?我可以使用相同的IBconnections完全相同的對象嗎?

有沒有更好的方法?

+0

我不認爲這是一個好主意。加載旋轉視圖是更改子視圖幀的更多開銷。我經常做的是在IB中的肖像中佈置按鈕,然後將IB中的視圖更改爲橫向,並查看是否可以僅使用佈局/拉伸選項調整/調整按鈕。 – NWCoder 2011-03-23 22:54:25

+0

我試過了佈局選項......不幸的是,沒有配置會改變爲所需的定義,感謝評論。 – ultifinitus 2011-03-23 23:16:40

回答

3

根據我需要的行爲,我使用了幾種不同的方法。看看哪個最適合你。

  1. 找到一套規則,讓你只用autoresizingMaskautoresizesSubviews支持兩個方向。

  2. 爲父視圖的-layoutSubviews查找一組規則,以便子視圖可以相對於父視圖的邊界重新排列。這比自動調整更有效,但比每個子視圖的兩個硬編碼位置更好。這通常需要創建更深層次的視圖層次結構,以便使用不同的-layoutSubviews行爲來嵌套多個視圖,以便在可見子視圖周圍獲得適當的定位和間距。

  3. 有兩個子視圖,每個方向一個子視圖。旋轉時隱藏一個。這允許在子視圖之間進行自定義轉換,如果您加載新的筆尖並替換根視圖,則不會得到這些子視圖。如果從它自己的筆尖加載每個子視圖,則可以卸載任何一個不再可見的子視圖以減少內存使用。然後您需要確保兩個視圖顯示相同的狀態,觸發相同的IBActions,並且有額外的IBOutlet引用(或者在從當前IBOutlet中仔細捕獲狀態,然後通過從nib加載新的子視圖來重新綁定狀態),以便設置屬性在每次輪換中的等效視圖。

  4. 結合上述選項2和3,爲每次旋轉加載具有不同佈局行爲的不同視圖,並在它們之間來回拖動子視圖。

+0

當!我以爲會有更簡單的方法!儘管謝謝你的迴應! – ultifinitus 2011-03-23 23:15:37

1

這是一個更簡單的方法 - 兩個NIB,使用蘋果的命名約定。我懷疑在iOS 6或7中,Apple可能會將其添加爲「功能」。我在我的應用程序使用它,它完美的作品:

  1. 會觸發(直到旋轉阿尼姆即將開始等待)將旋轉
  2. 用來橫向/縱向文件(默認蘋果的命名約定。 png是Default-landscape.png,如果你想蘋果自動加載風景版本)
  3. 重新加載新的NIB
  4. 重置自我。視圖 - 這將自動更新顯示
  5. 然後調用viewDidLoad中(蘋果不會把這個給你,如果你手動重新加載NIB)

(NB stackoverflow.com這裏需要這句話 - 有一個在代碼格式化程序錯誤)

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) 
    { 
     [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])] owner:self options:nil]; 

     [self viewDidLoad]; 
    } 
    else 
    { 
     [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", NSStringFromClass([self class])] owner:self options:nil]; 

     [self viewDidLoad]; 
    } 
}