5

IOS6の新しいローテーション方法を使用する必要があることは知っていますが、私が作成した方法は機能しないようです。

plistファイルをすべての回転を許可するように設定しましたが、portraitUpsideDownは許可しません

その後、appDelegateに次のようになりました。

self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
[self.window setRootViewController:navController];  //add nav controller to be the root view

次に、rootViewで、別のコントローラーにプッシュするために、次のようにします。

WebViewViewController *webController = [[JBWebViewViewController alloc] init];
webController.urlString =   urlName;
[self.navigationController pushViewController:webController animated:YES];

そして、Webコントローラーには次のものがあります。

#pragma mark - System Rotation Methods
//for any version before 6.0
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//only allow landscape
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

/for 6.0+
- (BOOL)shouldAutorotate{
return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

私がやりたいのは、ルートビューで3回転を許可することですが、Webビューに切り替えるとき(サブビューを追加するのではなく、プッシュナビゲーションを行うことに注意してください)、ポートレートビューのみを許可したいと思います。

誰か助けてください

- - - -アップデート - - - - -

UINavigationControllerの独自のnavControllerサブクラスを作成しました。自動回転の仕様を通知するように設定できるBOOLlandscapeModeOnがあります。

#pragma mark - System Rotation Methods
//for any version before 6.0
- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation
{
  if (landscapeModeOn) {
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
  } else {
    return interfaceOrientation == UIInterfaceOrientationPortrait;
  }
}

//for 6.0+
- (NSUInteger)supportedInterfaceOrientations{
  if (landscapeModeOn) {
    return UIInterfaceOrientationMaskAllButUpsideDown;
  } else {
    return UIInterfaceOrientationMaskPortrait;
  }
}

- (BOOL)shouldAutorotate{
  UIInterfaceOrientation ori = [UIDevice currentDevice].orientation;
  if (landscapeModeOn) {
    return ori != UIInterfaceOrientationPortraitUpsideDown;
  } else {
    return  ori == UIInterfaceOrientationPortrait;
  }
}

サブビューの読み込みでは、次のようにします。

- (void)viewWillAppear:(BOOL)animated{
  //get nav controller and turn off landscape mode
  JBNavController *navController = (JBNavController*)self.navigationController;
  [navController setLandscapeModeOn:NO];
  [navController shouldAutorotate];
}

--------------------ベストアンサーの見積もりを参照してくださいIOS6の場合、アップルは現在、ストーリーボードのAutoLayoutを新しい回転定義と一緒に使用することに焦点を当てています。一部を修正するのは困難です。 ios4.3およびios5のコーディング構造に基づくIOS6の小さなバグ

applefreakから、彼の提案は次のことを示唆しています。

あなたの場合の主な課題は、オリエンテーションを処理しないことです。実際には、さまざまなビューコントローラを特定の方向にロックしています

手動回転ビューはバグなしで行うのは本当に難しいようですが、それは私が今試している唯一の解決策のようですが、解決したらもっと投稿します

4

3 に答える 3

6

状況に応じて、NavigationControllerをサブクラス化し、shouldAutorotateメソッドとsupportedInterfaceOrientationsメソッドを追加する必要があります。iOS6は、iOS5とは逆の順序でナビゲーションスタックを要求するようになったため、最初にNavigationControllerに要求し、それがYESを返した場合、子ビューコントローラーとは通信しません。これを修正するには、これを行うために自分でロジックを追加する必要があります

したがって、サブクラス化されたナビゲーションコントローラでは、現在のビューコントローラに自動回転機能を手動で要求します。

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

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

個々のビューコントローラで、これらの関数を実装し、質問で定義した必要な値を返すようにすることができます。

これが理にかなっていることを願っています。

于 2012-09-24T21:47:30.037 に答える
2

次のコードは間違っています!

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

supportedInterfaceOrientationsは、shouldAutoRotateがYESを返した場合にのみ呼び出されることに注意してください。これで、ルートビューコントローラは、子が回転するかどうかを決定します。

あなたの場合、基本クラスのコントローラーをself.viewControllerに設定し、self.viewControllerをnavigationControllerではなくルートビューコントローラーに設定することをお勧めします。そうしないと、回転メソッドが呼び出されません。私はこれと同じ問題に遭遇しました。ベースビューコントローラとその子とのHAS-A関係が必要です。アクティブな子に基づいてShouldAutoRotateからYes/Noを返し、サポートされている方向についても同じです。このアーキテクチャに従うと、複雑なアプリでも一貫性があります。

たとえば、あなたの場合、BaseviewControllerはshouldAutoRotateからYESを返し、webviewControllerがアクティブな場合、サポートされているオリエンテーションデリゲートからUIInterfaceOrientationPortraitを返す必要があります。これが理にかなっていることを願っています。

于 2012-09-24T22:01:02.667 に答える
0

iOS5とiOS6の共通コード

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation))  
    { 
        // here to  implement landscope code
    }

    else
    {  
        // here to  implement setframePortrait
    }
}
于 2012-09-26T13:38:21.120 に答える