1

アプリでいくつかのアニメーションを作成しようとしていますが、いくつかのバグがあります。すべては私の「startAnimatingIndicators」メソッドから始まります。このメソッドが行うことは、2 本の垂直線 (どちらも画面の各端にあります) をメイン ビューのほぼ中央にアニメーション化することです。これが終了すると、別のアニメーションが呼び出され、最終的に 2 本の線がビューの中心に到達し、同時に中心に新しい垂直線がフェード インします。

この一連のアニメーションは、StopAnimatingIndicators メソッドを呼び出す停止ボタンを押すまでループします (ご覧のとおり、再帰的なメソッドです)。

最初はすべて正常に動作しますが、アニメーションを 2 回目に実行すると、別の方法で開始されることがあります (常にではありません)。中央の 2 本の縦線から始まり、それぞれの画面の端に移動し、アニメーションが正常に流れる場合があります。両方の垂直線が正常に中央に移動することがありますが、反対側の端に到達するまで動き続け、アニメーションが正常に流れます。

どうしてこうなったのかわからないので、どなたか教えていただければ幸いです。私の CGAffinityIdentityTransform に問題があるのではないかと思いますが、何が問題なのか正確にはわかりません。私が使用しているコードは以下のとおりです。ありがとう!

- (void)startAnimatingIndicators
{
    NSInteger metronomePreset = [(NSNumber*)[self.metronomePresets objectAtIndex:self.metronomePresetIndex] intValue];
    NSTimeInterval duration = (60.0 / metronomePreset);

    CGFloat firstPartXTranslation = self.videoPreviewView.center.x - self.indicatorLeft.center.x - self.indicatorLeft.frame.size.width;
    CGFloat secondPartXTranslation = self.indicatorLeft.frame.size.width;

    [self animateIndicatorsWithFirstPartXTranslation:firstPartXTranslation secondPartXTranslation:secondPartXTranslation andDuration:duration];
}

- (void)animateIndicatorsWithFirstPartXTranslation:(CGFloat)firstPartXVariation secondPartXTranslation:(CGFloat)secondPartXTranslation andDuration:(NSTimeInterval)duration
{
    [UIView animateWithDuration:duration 
                          delay:0 
                        options:UIViewAnimationCurveEaseIn | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                          self.finishingIndicator.alpha = 0.0;
                          self.indicatorLeft.transform = CGAffineTransformTranslate(self.indicatorLeft.transform, firstPartXVariation, 0.0);
                          self.indicatorRight.transform = CGAffineTransformTranslate(self.indicatorRight.transform, -firstPartXVariation, 0.0);
                      } 
                     completion:^(BOOL finished){
                          if(finished)
                          {
                              [UIView animateWithDuration:ANIMATION_END_DURATION 
                                                    delay:0 
                                                  options:UIViewAnimationCurveLinear | UIViewAnimationOptionAllowUserInteraction
                                               animations:^{
                                                   self.finishingIndicator.alpha = 1.0;
                                                   self.indicatorLeft.transform = CGAffineTransformTranslate(self.indicatorLeft.transform, secondPartXTranslation, 0.0);
                                                   self.indicatorRight.transform = CGAffineTransformTranslate(self.indicatorRight.transform, -secondPartXTranslation, 0.0);
                                               }
                                               completion:^(BOOL finished){
                                                   [self stopAnimatingIndicators];
                                                   if(finished)
                                                   {
                                                       [self animateIndicatorsWithFirstPartXTranslation:firstPartXVariation secondPartXTranslation:secondPartXTranslation andDuration:duration];

                                                       [self playSound:@"metronome" withExtension:@"wav"];
                                                   }
                                               }
                               ];
                          }
                      }
      ];
}

- (void)stopAnimatingIndicators
{    
    self.indicatorLeft.transform = CGAffineTransformIdentity;
    self.indicatorRight.transform = CGAffineTransformIdentity;

    [CATransaction begin];
    [self.finishingIndicator.layer removeAllAnimations];
    [self.indicatorLeft.layer removeAllAnimations];
    [self.indicatorRight.layer removeAllAnimations];
    [CATransaction commit];

    self.finishingIndicator.alpha = 0.0;

    [self resetIndicatorsPosition];
}

- (void)resetIndicatorsPosition
{
    CGRect indicatorLeftFrame = self.indicatorLeft.frame;
    CGRect indicatorRightFrame = self.indicatorRight.frame;
    indicatorLeftFrame.origin.x = LEFT_INDICATOR_X_OFFSET;
    indicatorRightFrame.origin.x = RIGHT_INDICATOR_X_OFFSET;
    self.indicatorLeft.frame = indicatorLeftFrame;
    self.indicatorRight.frame = indicatorRightFrame;
}
4

1 に答える 1

0

次の場合にコンパイラ エラーまたは警告が表示されますか。

indicatorLeftFrame.origin.x = LEFT_INDICATOR_X_OFFSET;
indicatorRightFrame.origin.x = RIGHT_INDICATOR_X_OFFSET;

そのような sのコンポーネントを設定することはできないという印象を受けましたCGRect。試してみると、間違いなくコンパイラ エラーが発生し、ビルドが機能しないため、どのようにビルドできるかさえわかりません。新しいものを作る必要があると思いますCGRect

indicatorLeftFrame = CGRectMake(LEFT_INDICATOR_X_OFFSET, 
                                indicatorLeftFrame.origin.y,
                                indicatorLeftFrame.size.width,
                                indicatorLeftFrame.size.height);
indicatorRightFrame = CGRectMake(RIGHT_INDICATOR_X_OFFSET, 
                                 indicatorRightFrame.origin.y,
                                 indicatorRightFrame.size.width,
                                 indicatorRightFrame.size.height);

このような場合 (つまり、フレームの原点が適切にリセットされていない場合)、問題がどのように発生するかがわかります。これがコメントに役立つかどうか教えてください。

于 2012-07-22T21:34:46.267 に答える