4

UIWebView と OptionsPane (カスタム ビューのカスタム UIViewController) を持つビューがあります。

ビューが表示されているときに、オプション ペイン (メイン ビューの上部にある) を所定の位置にフリップする必要があります。コードを使用していますが、奇妙な結果が得られます。

ビューが最初に表示されると、オプション ペインが既に表示されているように見えます... navController で [戻る] を押してビューを再度プルアップすると、アニメーションは完全に機能します。

誰でもこのトピックに光を当てることができますか?

- (void)viewDidLoad {
    [super viewDidLoad];
    optionsPane=[[OptionsPaneController alloc] initWithNibName:@"OptionsPane" bundle:nil];
}

- (void)viewWillAppear:(BOOL)animated {

    [optionsPane.view removeFromSuperview];
    [self checkOptionsVisible];
}

-(void)checkOptionsVisible{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[optionsPane view] cache:YES];
    [[self view] addSubview:[optionsPane view]];
    [theWebView setFrame:CGRectMake(0,87,320,230)];
    [[optionsPane view] setFrame:CGRectMake(0,0,320,87)];
    [UIView commitAnimations];      
}
4

4 に答える 4

1

うーん、viewWillAppear メッセージが初めて送信されるとは思いません。SDKで読んだことが 2 つあります。そのメッセージ内で super を呼び出す必要があり、初めて適用される可能性がある大きな警告があります。

警告: ビュー コントローラーに属するビューがビュー階層に直接追加された場合、ビュー コントローラーはこのメッセージを受け取りません。ビュー階層にビューを挿入または追加し、それにビュー コントローラーがある場合は、関連するビュー コントローラーにこのメッセージを直接送信する必要があります。ビュー コントローラにこのメッセージを送信しないと、関連するアニメーションが表示されなくなります。

最終的には、デバッガーを実行して、viewWillAppear メッセージが送信されていると思われるときに送信されていることを確認します。

于 2009-05-29T17:02:19.450 に答える
0

あなたの説明が理解できれば、先日、私は非常によく似た問題を抱えていました。

最初のロードで発生するのは、viewDidLoadが最初に起動することです。nibファイルのロードには、viewWillAppearがそれ自体を起動するのにかかる時間よりも少し時間がかかります。

私たちが得ているのは、viewWillApperがすでにリタイアした後のペン先のロードです。

その後のロードでは、viewDidLoadは起動せず、viewWillAppearに忠実な反転ジョブを実行させます。

何をすべきか?
まず、「viewDidAppear」を使用するようにコードを変更してみてください。それは役立つはずですが、見栄えが良いかどうかを確認する必要があります。

もう1つのオプション(醜いものですが)は、viewDidLoadでもcheckOptionsVisibleを呼び出すことです。
それが役に立たない場合は、タイマーをハックと見なします-要件が許せば。

問題を解決するためにあなたがより近くなることを願っています。

于 2009-06-03T19:14:36.533 に答える
0

UIViewController のビュー プロパティは遅延ロードされます。ここにいるように nib を使用して初期化していても、ビュー自体は、プロパティが初めてアクセスされるまで実際にはインスタンス化されません。

より多くのコードを見ずに何が起こっているのかを正確に知ることは困難ですが、viewDidLoad で optionsPane.view にアクセスすると、必要な結果が得られる場合があります (何もする必要はありません。プロパティにアクセスして強制的に読み込みます)。

于 2009-06-03T20:08:03.167 に答える
0

あなたの状況に合わせて更新されました:

代わりに、次の 4 つのビューがあります。

  1. バックビュー

  2. メインビュー

  3. 背面図 (オプション ペイン) 100 ピクセル

  4. 正面図 (ブランク ビュー) 100 ピクセル

通常どおり、メイン ビューをバッキング ビューに追加します。

オプション ペインを表示する背面図に正面図を追加します。

正面図と背面図のフレームが同じであることを確認してください。

正面図と背面図を反転するメソッドを使用して、以下と同じコードを使用します。


元の回答

3 つのビューが必要です。

  1. バックビュー

  2. 正面図

  3. 後ろ姿

バッキング ビューは、前後に反転するときに他の 2 つを保持するだけです。以下は、反転方法です。両方を backingViewController に配置します。

- (void)displayBack{

    //parent controller is an ivar so the sub-view controllers know who their daddy is
    backController.parentController = self;


    [UIView beginAnimations:nil context:@"flipTransitionToBack"];
    [UIView setAnimationDuration:1.2];

    //note self.view IS the backing view
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];

    //remove the front view
    [[frontController view] removeFromSuperview];
    //add the back view view
    [self.view addSubview:[backController view]];
    [UIView commitAnimations];

    //giving a heads up to the view that is about to come on screen
    [backController viewWillAppear:YES];

}



- (void)displayFront{

    [UIView beginAnimations:nil context:@"flipTransitionToFront"];
    [UIView setAnimationDuration:1.2];

    [UIView setAnimationDelegate:self];

    //I'm interested in knowing this has happened
    [UIView setAnimationDidStopSelector:@selector(flipAnimationDidEndWithID:finished:context:)];

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
    //remove back view
    [[backController view] removeFromSuperview];
    //add the front view
    [self.view addSubview:[frontController view]];
    [UIView commitAnimations];

}  
于 2009-06-02T22:17:45.750 に答える