1

iOS 6用にアプリを更新しようとしていますが、主な課題は自動回転の処理です。このトピックに関連する質問と検索結果がありますが、私の質問に直接答えるものはありません。私は、andの廃止とその置き換えを理解していshouldAutorotateToInterfaceOrientation:ます-この質問はそれらに直接関係していません。supportedInterfaceOrientationsshouldAutorotate

代わりに、どのように置き換えることができるかを知りたいと思ってwillAutorotateToInterfaceOrientation:duration:います。これは、私のアプリが回転アニメーションとレイアウトの再構築のほとんどすべてを処理する場所です。私のメインビューコントローラーは、起動時にメインウィンドウに追加され、アプリの内部レイアウト全体を処理するフルスクリーンビューを制御しますが、これはやや複雑です。このビューコントローラのwillAutorotateToInterfaceOrientation:duration:メソッドは、一部のサブビューのサイズを直接変更し、他のサブビューを処理するC++オブジェクトを呼び出します。サブビューの複雑な階層、サイズ変更されないもの、画面外にあるものなど、インターフェイスの可変性のため、Appleの自動サイズ変更マスクはこの種の自動回転を処理するのに十分な強力なソリューションを提供するとは思わない。

今と同じように行動する方法はありwillAutorotateToInterfaceOrientation:duration:ますか?私がオンラインで実験的に見つけたように、このメソッドdidRotateFromInterfaceOrientation:はiOS 6のメインビューコントローラーでviewWillLayoutSubviews呼び出されることはありません。また、とにかく私のニーズを完全には満たしていないのではないかと思いますが、呼び出されることはありません。

さらに詳しい情報が必要な場合はお知らせください。これにはかなり簡単な解決策があることを願っています。これは、Appleが開発者を新しい、より狭いプロトコルに準拠していない場合にオオカミに見捨てる例ではありません。

編集:これが明確にするのに役立つ場合は、これが私が話している機能の基本的なシェルです:

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、フレームを変更するビューを所有している、フレームを変更するビューを所有している他のオブジェクトを所有しているなどです。

4

1 に答える 1

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;
}
于 2012-10-26T09:57:37.470 に答える