2

画像がほぼ全画面表示で、ナビゲーション コントローラー、ツールバー、ボタン (画像間を移動するため)、およびスライダー (画像間をすばやく移動するため) がすべてフェードアウトする画像ギャラリー タイプのビューをセットアップしようとしています。相互作用し、タップで戻ります。私がこれまでに持っているもの(これを行う正しい方法にさえ近づいていないと確信しています。私は初心者のようなものです)は次のとおりです。

-(void)fadeOutViews{


     [self fadeOutView:rightButton];
     [self fadeOutView:leftButton];
     [self fadeOutView:mySlider];
     mySlider.enabled = NO;
     [self fadeOutView:myToolbar];
     [self fadeOutView:self.navigationController.navigationBar];

}



-(void)fadeOutView:(UIView *)view{

    view.alpha = 1;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

    [UIView setAnimationDelegate:self];

    [UIView setAnimationDuration:2];
    view.alpha = 0;

    [UIView commitAnimations];

}

-(void)stopFadeOut{

    [rightButton.layer removeAllAnimations];
    [leftButton.layer removeAllAnimations];
    [mySlider.layer removeAllAnimations];
    [myToolbar.layer removeAllAnimations];
    [self.navigationController.navigationBar.layer removeAllAnimations];

}

-(void)resetToInitialConfigurationWithDelay:(int)delay{

    if (buttonWasPressed){
        delay = 4;
        buttonWasPressed = NO;
    }

    rightButton.alpha = 1;
    leftButton.alpha = 1;
    mySlider.alpha = 1;
    myToolbar.alpha = 1;
    self.navigationController.navigationBar.alpha = 1;

    mySlider.enabled = YES;

    [self stopFadeOut];

    [self performSelector:@selector(fadeOutViews) withObject:nil afterDelay:delay];
}

したがって、理論的には、初期状態にリセットします (遅延は、ボタンを使用して進むときに画像がフェードインおよびフェードアウトするためです。そのため、ボタンを押した後にフェードする前に、より多くの時間が必要です。そうしないと、フェードがすぐに開始されます)新しい画像がロードされた後. これによりすべてが元の状態にリセットされ, フェードのプロセスが再び開始されます. そして, フェードプロセスを停止する必要がある何かが発生した場合, stopFadeOut はすべてのアニメーションを削除します. たとえば, タップが発生した場合:

- (IBAction)tapOccurs:(id)sender {
    [self stopFadeOut];
    [self resetToInitialConfigurationWithDelay:2];
}

以前のアニメーションはすべて停止され、プロセスが再開されます。または、少なくともそれが理論です。実際には、たとえば、すばやく連続して数回タップすると、フェードしたビューが一時的にフェードし始め、リセットが何度も繰り返されるため、最終的に完全にフェードアウトするまで、点滅しているように見えます。おそらく問題はアニメーションが遅れていることだと思いましたが、 removeAllAnimation 呼び出しはそうではなかったので、 [self stopFadeOut]; を置き換えました。with [self performSelector:@selector(stopFadeOut) withObject:nil afterDelay:2];

しかし、結果は同じでした。stopFadeOut が呼び出されない場合の動作はまったく同じであるため、何らかの理由で removeAllAnimations 呼び出しが機能しないという結論しか得られません。何か案は?

4

1 に答える 1

3

何が起こっている

前回の実行が完了する前に、reset メソッドが複数回呼び出されているように思えます。これは、タップ メソッドとリセット メソッドの両方にログ ステートメントを追加し、各メソッドのログ数を数えて、連続して複数回タップしたときに何が起こるかを確認することで簡単に確認できます。

以下の図で問題を説明しようとしました。

T = tapOccurs:
O = fadeOutViews:
--- = wait between T & O

Normal single tap  
T-----O    T-----O      
---------------------> time

Multiple taps in a row
T-----O 
  T-----O
      T-----O
---------------------> time

What it sound like you are trying to do
T-
  T---
      T-----O
---------------------> time

fadeOutViews:(図で呼び出される) が呼び出されるたびOに、ビューはフェードアウトします。あなたの fadeOutView: 実装を見ると、これは不透明度が 1 にジャンプしてからゆっくりと 0 にフェードすることを意味します。したがって、最終的に最初からやり直すまで、タップ数と同じ回数点滅しているように見えます。

これを防ぐ方法

これが起こらないようにするために、いくつかのことを行うことができます。cancelPerformSelectorsWithTarget:1 つのことは、またはのようなものを呼び出して、スケジュールされたすべてのリセット メソッドをキャンセルすること cancelPreviousPerformRequestsWithTarget:selector:object:です。

于 2012-09-25T06:55:10.900 に答える