2012-06-11 71 views
1

我很難弄清楚如何處理我的iPad應用程序的一個屏幕不同的設備方向。這是我的情況:如何在iOS中旋轉時移動一個UIView?

〜除了一個標籤外,所有屏幕都可以使用彈簧和支柱完美旋轉。這個標籤的問題是我希望它以非正統的方式(對角線)移動,因此彈簧和支柱(或調整掩碼不起作用)。

〜那我考慮這樣做的方式是這樣:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if(UIInterfaceOrientationIsLandscape(newInterfaceOrientation)) 
    { 
     self.myScreenLabel.frame = CGRectMake(600,0,400,100); 
    } 
    else { 
     self.myScreenLabel.frame = CGRectMake(...//something); } 
} 

我還要把支票在viewDidLoad中有類似的邏輯。 If in portrait mode, put label at... else put label at...

我認爲這會奏效;然而,我有點想知道是否有更好的設計方法來做到這一點。上面的方法到處都有硬編碼的數字;因此,有沒有更好的方法來做到這一點?此外,這種方法並沒有利用這樣一個事實,即我的標籤完美地放置在縱向模式的故事板中,而且這只是我需要改變的風景。

有關更好設計的任何建議?

+0

我會保持簡單:將兩個視圖作爲代理放入您的筆尖,然後使用其中任意一個設置標籤的框架。這樣,你只保留一個筆尖,並在IB中做所有的佈局。代理視圖可以保持隱藏狀態。使這項工作所需的代碼非常少且非常可讀,如下所示:'self.actualLabel.frame = landscape?self.landscapeProxy.frame:self.portraitProxy.frame;' – mvds

回答

3

第一個問題,我已經在方向改變的情況下實施了行爲,並且沒有不好的結果,如果沒關係在旋轉發生之前觸發該方法。另外,您也可以使用NSNotifications對方向變化添加一個觸發器:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)name:UIDeviceOrientationDidChangeNotification object:nil]; 

然後添加等的方法:

- (void) didRotate:(NSNotification *)notification { 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    if (orientation == UIDeviceOrientationLandscapeLeft) { 
     //your code here 
    } 
} 

關於你提到的第二個問題,這樣的定位架是可怕的,但我認爲你意識到。相反,將元素與其他東西相關放置,就像一個支柱(也就是說,總是將相對於它之間的距離的位置放置在支撐之間)。因此,在視圖中使用窗口的框架,視圖的框架或其他一些UIView子類來定位對象,而不是絕對數字。

+2

要非常謹慎地混合* device * orientation和*界面*方向。因爲這個,我看到了很多奇怪的錯誤。要認識到的最重要的事情是,該設備知道面朝上/向下的方向,而界面不知道。 – mvds

+0

好啊,你完全正確,我會用你的建議更新我的答案,因爲我也看到了這些錯誤。 –

0

一對夫婦的想法:

  1. 如果iOS 5以上,你可能想使用viewWillLayoutSubviews,甚至可能更重要,因爲在iOS 6的發佈說明的意見重新模態的意見和屏幕方向調整的方法。這也有你的代碼在一個地方的優勢。由於我仍然支持pre 5(雖然我不會持續太久),但實際上我已經對iOS版本進行了動態檢查,並且如果在5.0之前調用了其他方法的viewWillLayoutSubviews,否則我會讓viewWillLayoutSubviews完成繁重的工作。

  2. 如果你的風景方向根本不同,你可能想追求Creating an Alternate Landscape Interface。我從來沒有這樣做過,但它似乎就像你的衚衕一樣。 SO上也有關於使用不同NIB的不同方向的貼子。但是,不確定這在故事板環境中是否有意義。

  3. 對於這些我們偶爾需要移動或根據屏幕尺寸調整大小的控件,我認爲我們大多數人都是通過viewWillLayoutSubviews來完成的。這就是該方法的全部目的(儘管我通常將它用於高度根據數據內容和屏幕寬度而變化的標籤)。我從來沒有停下來認爲可能有另一種方式。如果您只有一個控件可以在您更改方向時移動,也許可以創建兩個額外的隱藏控件,一個用於要在縱向顯示控件的位置,另一個用於橫向控件的隱藏控件(並且在IB中,您可以切換視圖方向以便於控件的佈局)。然後在你的viewWillLayoutSubviews中設置你的實際可見控件的框架爲這兩個隱藏控件之一的框架(當然取決於方向)。這使您擺脫了代碼中硬編碼框架座標的業務,並充分利用了IB的優勢。這整個建議可能太可愛了一半,但如果你不想通過我的第二點的努力,這是一種替代方法。