0

私のアプリは、2つのグループのviewControllersをサポートしています。1つは縦向きで動作することになっているグループで、もう1つは横向きで動作するはずです。

異なる方向のviewControllerを提示すると方向が間違ってしまうため、誰かがviewController包含マスターviewControllerを作成して(すべての方向にshoulAutorotate YESにする)、そこからviewControllerの2つのブランチを追加するように提案しました。ポートレート)とランドスケープ用に1つ(ランドスケープの場合はshouldAutorotate YESを使用)。私の質問は:これはうまくいくでしょうか?つまり、各ブランチの各viewControllerは正しい方向に回転しますか?

別の質問はこれです:私のプロジェクトはシングルビューXcodeテンプレートに基づいています。そのテンプレートは、アプリの起動時に表示されるものとしてRootViewControllerを作成します。私の問題はこれです:包含提案を機能させるには、このrootViewControllerをコンテナーviewControllerで変換し、必要なすべてのコードを別のView Controllerに移動して、アプリの起動時にそれを提示する必要があります。私はこれを意味します:

私が今日持っているもの

  • アプリが実行され、rootViewControllerが表示されます。これをvCAと呼びましょう。

rootViewControllerをコンテナviewControllerに変更すると、これが発生します

  • アプリが実行され、完全に空で古いvCAを提示する必要があるcontainerControllerが表示されます。

私にはばかげた解決策のように見えます。つまり、空でvCAを呼び出すcontainerControllerを提示しますか?

それ、どうやったら出来るの?

ありがとう。

4

1 に答える 1

0

モーダルViewControllerのようにpresentという用語を使用しているため、質問はやや混乱しますが、別のソリューションを作成する包含についても言及しています。

それはすべてあなたのアプリに本当に依存します。ViewControllersの一方のブランチがポートレートのみで、もう一方のブランチがランドスケープのみの場合、2つを切り替える瞬間のため、封じ込めの使用はおそらく困難になります。オリエンテーションの呼び出しは親から子に渡されますが、ローテーションが発生したときにのみ呼び出されます。たとえば、携帯電話が縦向きで縦向きのVCを表示している場合、横向きのVCに切り替えると縦向きで表示され、デバイスを回転させると、オリエンテーションコールによって横向きになり、元に戻らないようになります。肖像画に。同じことが逆になります。デバイスに各ViewControllerのすべての方向コールバックを強制的に実行させて回転を強制するトリックがありますが、すべてのiOSバージョンで機能するかどうかはわかりません。rootViewControllerのビューをそのスーパービュー(ウィンドウ)から削除し、すぐに再度追加すると、オリエンテーションコールバックがトリガーされます。したがって、子ViewControllerを切り替えるたびにそれを試みることができます。

または、包含を使用する代わりに、ポートレートVCをrootViewControllerとして使用し、ランドスケープViewControllerを作成して、メモリに残るようにどこかに保存することもできます。ランドスケープViewControllerを表示する必要がある場合は、rootViewControllerでモーダルに表示します。自動回転方法が正しく設定されている場合、ステータスバーの方向が変更され、VCが正しい方向で表示されます。それを閉じると、向きは縦向きに戻ります。

編集:

ここにはXcodeはありませんが、メモ帳にすばやく入力しました。これは機能するはずです。この場合、トランジションなしで、デバイスの向きを強制的に切り替えます。アニメーションを使用する場合は、_landscapeVCのmodalTransitionStyleプロパティを確認してください。

// In AppDelegate.h
PortraitViewController* _portraitVC;
LandscapeViewController* _landscapeVC;

// In AppDelegate.m
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    _portraitVC = [[PortraitViewController alloc] init];
    _landscapeVC = [[LandscapeViewController alloc] init];

    self.window.rootViewController = _portraitVC;
    [self.window makeKeyAndVisible];
}

-(void)showLandscape
{
    [_portraitVC presentViewController:_landscapeVC animated:NO completion:^{}];
    [UIApplication sharedApplication].statusBarOrientation = _landscapeVC.interfaceOrientation;
}

-(void)showPortrait
{
    [_landscapeVC dismissViewControllerAnimated:NO completion:^{}];
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}
于 2012-11-05T00:11:00.593 に答える