48

私はこれに対する解決策を求めてインターネットを精査してきましたが、何も見つかりません。iOS 5 アプリを iOS 6 対応にしようとしています。オリエンテーションを正しく機能させることができません。回転がいつ発生するかを検出できません。これが私が試しているコードです:

- (BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

新しい supportedInterfaceOrientation: メソッドが問題なく呼び出されます。ただし、shouldAutorotate メソッドは起動しません。回転時に画像を交換する必要がありますが、回転が発生しようとしているという兆候を得ることができません。

前もって感謝します。

4

9 に答える 9

80

アプリの起動時に次のエラーが発生するかどうかを確認します。

アプリケーション ウィンドウには、アプリケーションの起動の最後にルート ビュー コントローラーがあることが期待されます。

その場合、それを修正する方法は、ファイルに次の変更を加えることAppDelegate.mです (ただし、これを修正する方法にはいくつかの回答があるようです)。

// Replace
[self.window addSubview:[navigationController view]];  //OLD

// With
[self.window setRootViewController:navigationController];  //NEW

この後、shouldAutoRotate正しく呼び出す必要があります。

于 2012-10-08T23:18:19.987 に答える
45

UINavigationController をアプリの基礎として使用する場合、次のサブクラスを使用して、最上位の子ビュー コントローラーが回転を決定できるようにする柔軟性を提供します。

@interface RotationAwareNavigationController : UINavigationController

@end

@implementation RotationAwareNavigationController

-(NSUInteger)supportedInterfaceOrientations {
    UIViewController *top = self.topViewController;
    return top.supportedInterfaceOrientations;
}

-(BOOL)shouldAutorotate {
    UIViewController *top = self.topViewController;
    return [top shouldAutorotate];
}

@end
于 2013-05-08T08:27:34.127 に答える
15

その方法はそれを決定する正しい方法ではありません。正しい方法はwillRotateToInterfaceOrientation:duration:

shouldは(shouldAutorotateではなく)向きに回転するメソッドは非推奨になり、iOS 6以降は呼び出されなくなりますが、とにかくそれを使用していた方法で使用することを意図したものではありません。

繰り返される反対票への応答を編集します。私が示した方法を使用することが(OPを引用するために)「回転が発生しようとしていることの表示」ではない理由を説明してください。質問の内容とタイトルが一致していません。

于 2012-10-08T04:32:57.360 に答える
10

iOS 6 では、回転時にコンテナー ナビゲーション コントローラーが子ビュー コントローラーを参照しないようです。

iOS 6 リリース ノート:

現在、iOS コンテナー (UINavigationController など) は、自動回転する必要があるかどうかを判断するために、子に相談しません。既定では、アプリとビュー コントローラーのサポートされるインターフェイスの向きは、iPad イディオムの場合は UIInterfaceOrientationMaskAll に設定され、iPhone イディオムの場合は UIInterfaceOrientationMaskAllButUpsideDown に設定されます。

この動作は簡単にテストできます。私がしたことは、同じカスタムView Controllerを使用することです

  1. メインView Controllerとしての最初のケース
  2. UIPageViewController の子としての 2 番目のケース

最初のケースでは、アプリケーションのサポートされている向きに一致する と をshouldAutorotate組み合わせるsupportedInterfaceOrientationsことによって、カスタム ナビゲーション コントローラーですべてが決定されます。supportedInterfaceOrientations

2 番目のケースでsupportedInterfaceOrientationsは、カスタム ビュー コントローラーの が UIPageViewController によって呼び出されたとしても、戻り値は考慮されません。2 つのメソッドが UIPageViewController のサブクラスで上書きされる場合に機能します。このクラスはサブクラス化されていないため、その副作用についてはわかりません。

于 2012-10-26T08:20:33.773 に答える
10

viewControllerの子viewControllerである場合UINavigationControllerは、次の操作を実行できます。

  • サブクラスUINavigationController
  • shouldAutoRotateサブクラスでオーバーライドする
  • topViewControllerこのメソッドが呼び出されたときに、このメッセージを送信します

// このメソッドはUINavigationControllerサブクラス内にあります

- (BOOL)shouldAutorotate
{
    if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
    {
        return [self.topViewController shouldAutorotate];
    }
    return NO;
}
  • これで、viewControllers がそれぞれこのメソッドに応答します。
  • 他の orinetaion-methods でも同じことができることに注意してください
于 2014-01-12T15:40:09.727 に答える
1

私は iOS 7 を使用していますが、私のケースが他の人の役に立つと思います。

UITabBarController をルートとする深いビュー コントローラー階層があります。shouldAutorotate が確実に呼び出される唯一の場所は、UITabBarController 内です。したがって、UITabBarController をサブクラス化し、回転制御ロジックを shouldAutorotate メソッド内に配置するだけです。

于 2014-04-20T13:54:44.473 に答える
1

アプリの起動時に次のエラーも表示されました。

「アプリケーション ウィンドウには、アプリケーションの起動の最後にルート ビュー コントローラーが必要です」

UISplitViewController *splitViewController を使用しています

その場合、それを修正する方法は、AppDelegate.m ファイルで次の変更を行うことです。

交換

 [self.window addSubview:[splitViewController view]];

[self.window setRootViewController:splitViewController];

これshouldAutoRotateが呼び出され、正しく機能した後。

于 2013-01-28T21:41:10.553 に答える
0

これは私がそれを行う方法です

現在の向きを確認したい場合は、この行を viewconrtoller.m ファイルに追加します

 #define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown

次に、向きを確認したい場所に、以下のように条件を書きます

- (void)viewDidLoad
{

        if(isPortrait)
        {
            //portrait mode....

            NSLog(@"its in IsPotraitMode");
        }
        else
        {
            //landscape mode....
            NSLog(@"its in IsLandscapeMode");
        }
}
于 2013-06-12T23:27:20.973 に答える
0

アプリのベースとして UINavigationController を使用する場合。UINavigationController のカテゴリを作成し、「UINavigationController+autoRotate」と呼びます。これを UINavigationController+autoRotate.h に入れます:

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;

@end

これを UINavigationController+autoRotate.m に入れます:

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

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

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

@end
于 2019-04-23T12:00:52.403 に答える