4

アルファをアニメーション化して作成した UIView をフェードインしようとしています。フェード インし、数秒間表示したままにしてから、フェード アウトする必要があります。

フェードアウト機能は正常に動作します。視界がスムーズに消えます。ただし、フェードインは、ビューが 0.5 秒間隔でゆっくりと表示されるのではなく、即座に表示されるだけです。

そのため、アニメーションのフェードが機能していないようで、アルファを即座に に設定するだけ1.0です。私はここで途方に暮れています。私が間違っていることはありますか?ありがとう!

-(void)presentPopupPhrase:(NSString *)phrase 
                   inView:(UIView *)view 
             withDelegate:(id)delegate 
            andCompletion:(void (^)(BOOL completed))completion {

    MessagePopupView *pv = [[[MessagePopupView alloc] initWithFrame:self.frame andText:phrase] autorelease];
    pv.alpha = 0.0;
    [view addSubview:pv];

    [self fadeInMPV:pv 
       withDuration:self.fadeDuration 
           andDelay:self.fadeInDelay];

    [self fadeOutMPV:pv 
        withDuration:self.fadeDuration 
          afterDelay:self.fadeOutDelay 
      withCompletion:completion 
         andDelegate:delegate];
}

-(void)fadeInMPV:(MessagePopupView *)mpv 
    withDuration:(NSTimeInterval)duration 
        andDelay:(NSTimeInterval)delay 
{    
    [UIView animateWithDuration:duration 
                          delay:delay 
                        options:UIViewAnimationOptionCurveLinear 
                     animations:^{
                         mpv.alpha = 1.0;
                     } 
                     completion:nil];
}

-(void)fadeOutMPV:(MessagePopupView *)mpv
     withDuration:(NSTimeInterval)duration
       afterDelay:(NSTimeInterval)delay
     withCompletion:(void (^)(BOOL completed))completion
      andDelegate:(id)delegate 
{
    [UIView animateWithDuration:duration 
                          delay:delay 
                        options:UIViewAnimationOptionCurveLinear 
                     animations:^{
                         mpv.alpha = 0.0;
                     } 
                     completion:completion];
}

編集:

それが役立つ場合は、呼び出し元の VC コードを次に示します。

-(void)viewDidAppear:(BOOL)animated {

    CGRect phraseFrame = CGRectMake(20, 341, 280, 65);
    PopupPhraseController *phraseController = [[[PopupPhraseController alloc] initWithFrame:phraseFrame] autorelease];

    [phraseController presentPopupPhrase:@"Test Phrase" inView:self.view withDelegate:self andCompletion:^(BOOL completed){
        if (completed) {
            NSLog(@"completed");
        } else {
            NSLog(@"not completed");
        }
        NSLog(@"blocked!");
    }];

    [super viewDidAppear:animated];
}
4

2 に答える 2

4

2 番目のアニメーション ブロックが本質的に最初のアニメーション ブロックをキャンセルするため、そのようにアニメーションを連鎖させることはできません。

複数のアニメーションを一緒にリンクするには、次の 2 つのオプションがあります。

  1. 最初のアニメーションの完了ハンドラを使用する
  2. アニメーションをネストしますが、2 番目のアニメーションを遅らせます

  1. このように見えます

    [UIView animateWithDuration:self.fadeDuration
                          delay:self.fadeInDelay
                        options:UIViewAnimationOptionCurveLinear 
                     animations:^{
                       pv.alpha = 1.0;
                     } completion:^(BOOL finished) {
    
                       [UIView animateWithDuration:self.fadeDuration
                                             delay:self.fadeOutDelay
                                           options:UIViewAnimationOptionCurveLinear 
                                        animations:^{
                                          pv.alpha = 0.0;
    
                                        } completion:completion];
                     }];
    
  2. このように見えます

    [UIView animateWithDuration:self.fadeDuration
                          delay:self.fadeInDelay
                        options:UIViewAnimationOptionCurveLinear 
                     animations:^{
                       pv.alpha = 1.0;
    
                       [UIView animateWithDuration:self.fadeDuration
                                             delay:self.fadeOutDelay + self.fadeDuration
                                           options:UIViewAnimationOptionCurveLinear 
                                        animations:^{
                                          pv.alpha = 0.0;
                                        } completion:completion];
    
                     } completion:nil];
    

この問題は、アニメーションの設定方法が原因です。

ビューにアニメーション化可能なプロパティを設定すると、ビューのバッキング モデルが即座に更新されます。したがってalpha = 1.0、最初のブロックで を設定すると、ビューのバッキング データ モデルのアルファが as1.0になり、実際のアニメーションが別のスレッドで開始され、2 つの値の間の補間が表示されます。

最初のブロックの直後に 2 番目のブロックを定義すると、ビューは基本的に「1.0(モデルの現在の値)からアニメーション化する必要があります0.0」と表示します。これが、期待どおりに表示されない理由です。

于 2012-11-17T01:22:01.093 に答える