1

なぜこの問題が発生しているのかよくわかりませんが、私は…基本的にnavigationController、タブの1つにが付いたTabrバーコントローラーを持っています。この特定のタブでは、ユーザーがデバイスを回転させて、元のビューを回転させたのではなく、まったく異なるビューを表示できるようにしたいと思います。

これを(フルスクリーンで)達成するためLandscapeViewControllerに、デバイスが横向きのときにモーダルに提示するものがあります。提示すると問題が発生しmodalViewControllerます…</p>

また、LandscapeViewControllerユーザーがポートレートモードに戻ったときに自分自身を却下できるように、向きも確認します。しかし、私がそれを提示すると、それがポートレートモードに入るというコールバックを受け取り、それは完全にそれを台無しにします!

何が起こっているのかを明確にするためのコードとログステートメントは次のとおりです。

PortraitViewController

(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
  NSLog(@"Norm going Portrait");

  [self changeTheViewToPortrait:YES andDuration:duration];
  
    }
    else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft){
  NSLog(@"Norm going Landscape");
  [self changeTheViewToPortrait:NO andDuration:duration];
    }
}


(void) changeTheViewToPortrait:(BOOL)portrait andDuration:(NSTimeInterval)duration {
 
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:5.];
 
    if(portrait){ 
  NSLog(@"dismissed");
  [self dismissModalViewControllerAnimated:NO];
    }
    else{ 
  NSLog(@"presented");
  LandscapeOverviewViewController *land = [[LandscapeOverviewViewController alloc]initWithNibName:@"LandscapeOverviewViewController" bundle:nil];
  land.delegate = self;
  [self presentModalViewController:land animated:NO]; 
  [land release];
    }
 
    [UIView commitAnimations];
}

LandscapeViewController

 (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
  NSLog(@"Modal is going Portrait");
  [self changeTheViewToPortrait:YES andDuration:duration];
  
    }
    else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft){
  NSLog(@"Modal is going Landscape");

  [self changeTheViewToPortrait:NO andDuration:duration];
    }
}

 (void) changeTheViewToPortrait:(BOOL)portrait andDuration:(NSTimeInterval)duration{
 
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:duration];
 
    if(portrait){ 
  NSLog(@"calling delegate to dismiss");
  [delegate landscapeViewController:self didRotateBack:(YES)]; 
    }
 
    [UIView commitAnimations];
}

これはログテキストです:

ノルムゴーイングランドスケープ

2010-08-24 15:29:40.024アプリ[32461:207]が発表されました

2010-08-24 15:29:40.026 App [32461:207]モーダルがポートレートになります

2010-08-24 15:29:40.026アプリ[32461:207]代理人に電話をかけて解雇

2010-08-24 15:29:40.027 App [32461:207]デリゲートが呼び出されました

縦向きで回転するとわかるように、を表示することで正しい動作をしますがlandscapevc、縦向きであると見なして却下しようとします。

誰かが私がどこで間違っているのか見ることができますか?(そして、これの長さの方針ですが、コードのフォーマットはそうでなければ正しく機能しません。)

4

1 に答える 1

1

ランドスケープ ビュー コントローラーに shouldAutorotateToInterfaceOrientation: メソッドを実装しましたか? そうでない場合、このView Controllerは強制的に縦向きモードのままになり、却下コードがトリガーされます。

また、View Controller が特定の向きでウィンドウに追加され、回転される場合があることにも注意してください。現在の回転に対して willRotate が渡す方向を確認することは価値があります。私はこれをしばらく確認していませんでしたが、2.x の後半 / 3.0 の初期には、これは一般的でした。

于 2010-08-24T16:52:48.307 に答える