0

2 つの ViewController を使用します。MainView と FlipViewController。MainView には一連のボタンとコントロール、およびグラフィックス ディスプレイが含まれており、FlipView には設定が含まれています。

MainView は、向きに応じて異なる XIB を読み込み、サポートするさまざまなボタンとグラフィックス画面を容易にします。これにより、物事をさまざまにレイアウトする柔軟性が大幅に向上します。プロジェクトは、StoryBoarding 機能が Xcode に追加される前に最初に作成されました。

通常の使用例は、MainView の縦向きモードで開始し、FlipView をビューに回転させるボタンをタッチすることです。私は FlipView で何かを行い (プログラムの側面を構成します)、変更をコミットします。これにより、MainView に戻ります。これまでのところ、すべて順調です。

この問題は、FlipView に入ってからデバイスを回転させて、FlipView が別の向きになると発生します。ポートレートをランドスケープに回転させたとしましょう。次に、FlipView から MainView に戻ります。この時点で、MainView は、FlipView が実行した Rotation を認識していません。そのため、Portrait XIB を使用して MainView を Portrait で表示しています。

MainView の willRotateToInterfaceOrientation は、FlipViewController から戻った後に呼び出されることはありません。したがって、方向の変更を検出することはなく、その結果、その方向の誤った XIB が保持されます。willRotateToInterfaceOrientation... の方向ハンドラーのサンプルを次に示します。

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

// if portrait, load the portrait XIB for Pad or Phone

if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {

    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

        [[NSBundle mainBundle] loadNibNamed:@"MainViewiPad" owner:self options:nil];

    }else{

        [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil];

    }

    [self viewDidLoad];

    intorient = 1;
 else.... handle Landscape...

そこで私は、viewWillAppear ルーチンを試し、MainView に回転を認識させ、システムごとに実行させる方法を見つけようとしました。しかし、これまでのところ、システムをこのように機能させる方法がわかりません。viewWillAppear が呼び出されたときに、正しい向きのリロードを強制するコードを生成する必要があると思います。しかし、これは正しく機能していません。なぜなら、変更が時間内にロードされないようであり、viewWillAppear メッセージ内から新しい XIB をリロードしようとするのは正しくないようです。

この動作を理解するための助けをいただければ幸いです。

4

1 に答える 1

0

わかった。ここで問題を見つけました。問題は、回転に関する情報が MainView に返されないことでした。これは、FlipView (これらの方向メッセージに反応する人) がメッセージを MainView に再送信することで簡単に処理できます。FLipView 内の私のコードは、以前は回転メッセージに対して何もしていませんでした (回転を自動処理していました) が、今では次のように FlipView にハンドラーを追加します。

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
        [mainView willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
}

これは基本的に、ローテーションのメッセージを MainView に戻します。これは、FlipView を開いたときに MainView が消えないために機能します。後ろにとどまり、受け取ったメッセージに応答できます。

注意すべきことの 1 つは、上記のコードに mainView への参照があることです。必要に応じてこの呼び出しを実行できるようにするには、FlipView の alloc-init の後にこれを渡す必要があります。これは、Flipview コードの MainView クラスに新しいプロパティを追加することを意味します。

FlipView を開く前に、MainView で次のようなことを行います。

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];


controller.delegate = self;
controller.mainView = self;
controller.lastIndexPath = lastIndex;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

これが、この種の問題を抱えている他の人に役立つことを願っています。Web ビューアーをモーダルで開いたときにも同じ動作に気付きました。同じ種類の問題を処理するために、そこで同じ手法を使用しました。

于 2013-01-24T17:06:21.657 に答える