8

次のViewControllerを設定しています。

viewController1は、縦向きを除く任意の方向に自由に回転できます。

viewController2はviewController1の上にプッシュされ、viewController1と同じ方向になり、回転できないようにします。

viewController3はviewController2の上にプッシュされます。viewController3をポートレートモードにしたいのですが。

iOS6でこれを達成しようとすると多くの問題が発生します(iOS5ではまだ試していません)。まず、私はすでに独自のナビゲーションコントローラーを作成し、それに次のものを入れました。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

- (BOOL) shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

私はこれらのことの多くの異なる組み合わせを試してみました。主に私が苦労しているのは、vc2が横向きの場合、vc3を縦向きとして表示するように強制することです。どんな助けでもいただければ幸いです。

4

3 に答える 3

12

ここでやろうとしているのは、フレームワークとの戦いです。説明しているのは、iOS 6でのナビゲーションコントローラーアーキテクチャの動作ではありません。ビューコントローラーのビューを表示して回転を強制する場合は、提示されたビューコントローラーを使用します。preferredInterfaceOrientationForPresentationそれが意味のある唯一の時間であり、表示supportedInterfaceOrientationsされるとインターフェイスのルートにあるため、ViewControllerが実際に参照されます。

于 2013-03-08T19:00:20.470 に答える
5

別の回答で、iOS 6では、新しいViewControllerをナビゲーションコントローラーにプッシュするときに強制的に回転させることはサポートされていないことを説明しました。代償回転に関するルール(つまり、ユーザーがデバイスを回転させた場合にどうなるか)を構成することはできますが、インターフェイスを強制的に回転させることはできません。iOS 6で強制的に回転させることができるのは、View Controller(presentViewController:animated:およびdismissViewControllerAnimated:)を表示または非表示にするときだけです。

ただし、表示されたView Controllerを、ナビゲーションコントローラーを押しているように見えるように使用することは可能です。私は私が何を意味するかを示す映画を作りました:

http://youtu.be/O76d6FhPXlE

さて、それは決して完全ではありません。ステータスバーの回転アニメーションはなく、2つのビューの間に一種の黒い「点滅」があります。これは、実際に起こっていることを隠すためにあるため、意図的なものです。ストーリーボードのこのスクリーンショットに示されているように、実際に起こっているのは、実際には2つの異なるナビゲーションコントローラーと3つのビューコントローラーがあるということです。

ここに画像の説明を入力してください

私たちが持っているのは:

  • 縦向きに設定されたnavコントローラーサブクラスとそのルートビューコントローラー

  • 横向きに設定された2番目のnavコントローラーサブクラスと、黒で中間として機能するそのルートビューコントローラー

  • 2番目のナビゲーションコントローラーのスタックにプッシュされる3番目のビューコントローラー

ユーザーが最初のViewControllerから「進む」ように要求すると、2番目のナビゲーションコントローラーが表示され、黒いView Controllerが一時的に表示されますが、すぐに3番目のViewControllerを押します。そのため、一種の黒いフラッシュとプッシュアニメーションとともに、強制的な回転が行われます。ユーザーが3番目のViewControllerの[戻る]ボタンをタップすると、プロセスが逆になります。

すべての移行コードは、黒いビューコントローラー(ViewControllerIntermediary)にあります。私はそれを微調整して、私ができる最も満足のいくアニメーションを提供しようとしました:

@implementation ViewControllerIntermediary {
    BOOL _comingBack;
}

- (void) viewDidLoad {
    [super viewDidLoad];
    self.navigationController.delegate = self;
}

-(void)navigationController:(UINavigationController *)nc 
        willShowViewController:(UIViewController *)vc 
        animated:(BOOL)anim {
    if (self == vc)
        [nc setNavigationBarHidden:YES animated:_comingBack];
    else
        [nc setNavigationBarHidden:NO animated:YES];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (!_comingBack) {
        [self performSegueWithIdentifier:@"pushme" sender:self];
        _comingBack = YES;
    }
    else
        [self.navigationController dismissViewControllerAnimated:YES 
            completion:nil];
}
于 2013-05-04T22:22:21.047 に答える
1
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([self.window.rootViewController.presentedViewController isKindOfClass: [SecondViewController class]])
{
    SecondViewController *secondController = (SecondViewController *) self.window.rootViewController.presentedViewController;

    if (secondController.isPresented)
        return UIInterfaceOrientationMaskAll;
    else return UIInterfaceOrientationMaskPortrait;
}
else return UIInterfaceOrientationMaskPortrait;
}

そしてスイフトのために

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int {

    if self.window?.rootViewController?.presentedViewController? is SecondViewController {

        let secondController = self.window!.rootViewController.presentedViewController as SecondViewController

        if secondController.isPresented {
            return Int(UIInterfaceOrientationMask.All.toRaw());
        } else {
            return Int(UIInterfaceOrientationMask.Portrait.toRaw());
        }
    } else {
        return Int(UIInterfaceOrientationMask.Portrait.toRaw());
    }

}

詳細については、このリンクを確認してください

于 2014-12-19T07:55:06.117 に答える