15

私のルート ビュー コントローラーの実装はsupportedInterfaceOrientationsほとんど常に を返しますがUIInterfaceOrientationMaskAll、それが を返すエッジ ケースが 1 つありますUIInterfaceOrientationMaskLandscape

ユーザーがデバイスを回転させた場合、これは機能しています。ただし、デバイスが縦向きモードで保持されているsupportedInterfaceOrientations場合、ユーザーが手動でデバイスを回転させない限り、メソッドが呼び出されることはありません。

このメソッドの戻り値が変更されたことをプログラムでシステムに伝えるにはどうすればよいですか?

ドキュメントによると、私は呼び出すことができるはずですが、[UIViewController attemptRotationToDeviceOrientation]これは何の効果もありません(supportedInterfaceOrientations呼び出されず、画面が回転しません)。

この問題を解決するために他の人が投稿したさまざまな回避策を見つけましたが、私のテストではどれも機能しません。iOS 5.0 では動作したかもしれませんが、iOS 6.0 では動作しなかったのではないかと思います。

YESルート ビュー コントローラーのshouldAutorotateメソッドに戻ります。

4

3 に答える 3

1

まず、UIViewController をランドスケープ モードで表示する場合は、これを使用すると便利です。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

また、多くの場合、UIViewController がどのコントローラーに埋め込まれているかによって異なります。

たとえば、UINavigationController の内部にある場合、その UINavigationController をサブクラス化して、このような方向メソッドをオーバーライドする必要がある場合があります。

サブクラス化された UINavigationController (階層の最上位のビューコントローラーが方向を制御します) は、self.window.rootViewController として設定する必要があります。

- (BOOL)shouldAutorotate
 {
     return self.topViewController.shouldAutorotate;
 }
 - (NSUInteger)supportedInterfaceOrientations
 {
     return self.topViewController.supportedInterfaceOrientations;
 }

iOS 6 から、UINavigationController がその UIVIewControllers に向きのサポートを要求しないようになりました。したがって、サブクラス化する必要があります。

ノート :

shouldAutorotateandメソッドはsupportedInterfaceOrientations、プッシュ操作が行われるたびに常に UINavigationController に対して呼び出されます。

于 2012-11-05T06:28:24.360 に答える
0

手動で回転させる必要があります。viewWillAppear:ビューコントローラのメソッドで次のロジックを呼び出す必要があります。

UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation];
if (![self supportsOrientation:curDevOrientation]) {
    // We're going to rotate 90 degrees clockwise.  First figure out what that
    // means to the status bar.
    UIInterfaceOrientation newStatusBarOrientation;
    switch (curDevOrientation)  {
        case UIDeviceOrientationPortrait:
            newStatusBarOrientation = UIInterfaceOrientationLandscapeRight;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            newStatusBarOrientation = UIInterfaceOrientationLandscapeLeft;
            break;
    }
    [[UIApplication sharedApplication] setStatusBarOrientation:newStatusBarOrientation animated:NO];

    // Now rotate the view 90 degrees clockwise.
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * 90.0 / 180.0);
    self.view.transform = transform;
}

これにより、特定のViewControllerのビューが表示されるたびに回転するはずです。

于 2012-11-12T03:32:51.770 に答える
0

Apple の UIViewController クラス リファレンスからの引用:

: 起動時に、アプリは常にインターフェイスを縦向きに設定する必要があります。application:didFinishLaunchingWithOptions: メソッドが戻った後、アプリは上記のビュー コントローラーの回転メカニズムを使用して、ウィンドウを表示する前にビューを適切な向きに回転させます。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

インターフェイスが縦向きで始まる場合、ユーザーがデバイスを横向きにしてアプリを開いた場合でも、自動回転は調整を処理できるはずです。

更新:ローンチ後のローテーションに役立つこの投稿を見つけました。どうやら iOS 6 はナビゲーション コントローラを見て、サポートされているデバイスの向きを判断しているようです。

iOS 6 で UIViewController を強制的に縦向きにする方法

于 2012-10-31T03:16:22.163 に答える