1

我正在嘗試更新iOS 6的應用程序,主要挑戰在於處理自轉。有與這個主題相關的問題和搜索結果,但沒有直接回答我的問題。我理解的shouldAutorotateToInterfaceOrientation:棄用,並同時更換supportedInterfaceOrientationsshouldAutorotate - 這個問題沒有直接關係的。如何在iOS 6中替換willAutorotateToInterfaceOrientation?

相反,我想知道我怎麼能代替willAutorotateToInterfaceOrientation:duration:,這是在我的應用程序處理幾乎所有的旋轉動畫和佈局結構調整。我的主視圖控制器控制一個全屏視圖,該視圖在啓動時添加到主窗口,並處理應用程序的整個內部佈局,這有點複雜。該視圖控制器中的willAutorotateToInterfaceOrientation:duration:方法直接調整一些子視圖,並調用處理其他子視圖的C++對象。由於接口的變量性質,其中包括一個複雜的子視圖層次結構,有些不能調整大小,有些不在屏幕上,等等,我不認爲蘋果的自動調整掩碼提供了一個足夠強大的解決方案來處理這種自動旋轉。

是否有某種方式來參加,我在willAutorotateToInterfaceOrientation:duration:現在做同樣的方式行動?正如我在網上和通過實驗發現,這種方法和didRotateFromInterfaceOrientation:從未在我的主視圖控制器中的iOS 6。我還發現,viewWillLayoutSubviews是從來沒有所謂的叫,但我懷疑這會不會很滿足我的需求呢。

請讓我知道如果你需要任何進一步的信息。我希望對此有一個相當直接的解決方案,如果蘋果不符合新的,更窄的協議,這不是蘋果放棄開發人員到狼羣的例子。

編輯:在這種情況下,有助於澄清,這裏的功能的基本的shell我說的是:

AppDelegate.mm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [self.window makeKeyAndVisible]; 
    MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]]; 
    [self.window addSubview:mainViewController.view]; 
    return YES; 
} 

MainViewController。 mm

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    [UIView beginAnimations:NULL context:nil]; 
    [UIView setAnimationDuration:duration]; 
    [someViewController someMethod]; 
    [someView setFrame:someRect]; 
    [UIView commitAnimations]; 

    someObject->CustomRotationFunction(toInterfaceOrientation, duration); 
} 

屬簡而言之,假定這些功能和方法發生的最壞情況,例如someObject擁有改變其框架的意見,它擁有其他對象,它們擁有改變其框架的意見等。

+0

[WWDC 2012](http://developer.apple.com/itunes/?destination=adc.apple.com.16351493766)會話236起始於約23在這個談判一分半鐘。在這裏很難提供一個好的答案,因爲我不知道你得到了什麼樣的瘋狂實施,所以我建議你先看那個視頻。 –

回答

3

您的主要問題是,您只是將您的ViewController視圖添加到窗口,而不是將其設置爲rootViewController。這就是爲什麼在iOS6中永遠不會調用willRotateToInterfaceOrientation,didRotateToInterfaceOrientation等等的原因。

在iOS5中,shouldAutorotateToInterfaceOrientation被傳遞給ViewController的每個childViewController,該窗口可以返回是否要旋轉。在iOS6中,rootViewController決定您的應用程序是否支持某個方向。所以你需要在iOS6中設置一個rootViewController,最好在早期的iOS版本中這樣做。您需要的方法將在正確的時間被調用,並將傳遞給任何childViewControllers。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [self.window makeKeyAndVisible]; 
    MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]]; 
    self.window.rootViewController = mainViewController; 
    return YES; 
} 
+0

工程就像一個魅力!謝謝! – Luke