2

アプリの各ページのテキストを表示するために [UIView animateWithDuration... ] を使用しています。各ページには独自のテキストがあります。ページ間を移動するためにスワイプしています。ページが表示された後にテキストがフェードインするように、1 秒のディゾルブ効果を使用しています。

問題は次のとおりです。その 1 秒間 (テキストがフェード インしている間) スワイプすると、次のページが表示されたときにアニメーションが完了し、2 つのテキスト (前と現在) が重なってしまいます。

実装したい解決策は、アニメーションの発生中にスワイプした場合にアニメーションを中断することです。私はそれを実現することはできません。[self.view.layer removeAllAnimations]; 私にはうまくいきません。

ここに私のアニメーションコードがあります:

   - (void) replaceContent: (UITextView *) theCurrentContent withContent: (UITextView *) theReplacementContent {

    theReplacementContent.alpha = 0.0;
    [self.view addSubview: theReplacementContent];


    theReplacementContent.alpha = 0.0;

    [UITextView animateWithDuration: 1.0
                              delay: 0.0
                            options: UIViewAnimationOptionTransitionCrossDissolve
                         animations: ^{
                             theCurrentContent.alpha = 0.0;
                             theReplacementContent.alpha = 1.0;
                         }
                         completion: ^(BOOL finished){
                             [theCurrentContent removeFromSuperview];
                             self.currentContent = theReplacementContent;
                             [self.view bringSubviewToFront:theReplacementContent];
                         }];

   }

これを機能させる方法を知っていますか?この問題に対処する他の方法を知っていますか?

4

3 に答える 3

11

で作成したアニメーションを直接キャンセルすることはできません+animateWithDuration...。やりたいことは、実行中のアニメーションをすぐに新しいものに置き換えることです。

次のページを表示するときに呼び出される次のメソッドを記述できます。

- (void)showNextPage
{
    //skip the running animation, if the animation is already finished, it does nothing
    [UIView animateWithDuration: 0.0
                          delay: 0.0
                        options: UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionBeginFromCurrentState
                     animations: ^{
                         theCurrentContent.alpha = 1.0;
                         theReplacementContent.alpha = 0.0;
                     }
                     completion: ^(BOOL finished){
                         theReplacementContent = ... // set the view for you next page
                         [self replaceContent:theCurrentContent withContent:theReplacementContent];
                     }];
}

UIViewAnimationOptionBeginFromCurrentStateに渡される追加に注意してoptions:ください。これが行うことは、基本的に、影響を受けるプロパティの実行中のアニメーションをインターセプトし、これに置き換えるようにフレームワークに指示します。duration:0.0に設定すると、新しい値が即座に設定されます。

ブロックではcompletion:、新しいコンテンツを作成して設定し、replaceContent:withContent:メソッドを呼び出すことができます。

于 2013-03-29T00:12:00.787 に答える
2

したがって、別の可能な解決策は、アニメーション中の相互作用を無効にすることです。

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
于 2013-03-28T23:20:55.630 に答える
0

のようなフラグを宣言しshouldAllowContentToBeReplacedます。アニメーションの開始時に false に設定し、終了したら true に戻します。次にif (shouldAllowContentToBeReplaced) {、アニメーションを開始する前に言います。

于 2013-03-28T23:26:31.267 に答える