2

私のアプリでは、このコードがviewWillAppearにあります。画面の上部から下部にランダムなオブジェクトをアニメーション化するだけです。問題は、衝突を検出する必要があることです。これまでに学んだことは、アニメーションの座標をいつでも取得することは不可能であるということです。では、NSTimerを使用してどのように実装できますか?またはNSTimerを使用しますか?私はそれを理解できませんでした。手がかりがあれば幸いです。

-(void)viewWillAppear:(BOOL)animated
{
    for (int i = 0; i < 100; i++) {

        p = arc4random_uniform(320)%4+1;

        CGRect startFrame = CGRectMake(p*50, -50, 50, 50);
        CGRect endFrame   = CGRectMake(p*50, CGRectGetHeight(self.view.bounds) + 50,
                                       50,
                                       50);

        animatedView = [[UIView alloc] initWithFrame:startFrame];
        animatedView.backgroundColor = [UIColor redColor];

        [self.view addSubview:animatedView];

        [UIView animateWithDuration:2.f
                              delay:i * 0.5f
                            options:UIViewAnimationCurveLinear
                         animations:^{
                             animatedView.frame = endFrame;
                         } completion:^(BOOL finished) {
                             [animatedView removeFromSuperview];
                         }];

}
4

4 に答える 4

3

私はあなたのターゲットにメッセージを送るNSTimerために捨てるでしょう。デバイスの画面のリフレッシュレートと同期しないため、アニメーションが途切れる可能性があります。まさにそれを行い、アニメーションをバターのように実行させます。CADisplayLinkNSTimerCADisplayLink

ドキュメント: http ://developer.apple.com/library/ios/#documentation/QuartzCore/Reference/CADisplayLink_ClassRef/Reference/Reference.html

最終的に、使用CADisplayLinkは次のようになります。

- (id) init {
    // ...
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    // ...
}

- (void) update {
    [myView updatePositionOrSomethingElse];
}
于 2012-09-06T16:39:43.753 に答える
2

オブジェクトを少しずつアニメーション化することができます(ループ内の場合もあります)。アニメーションを完了するたびに、座標を取得できます。

于 2012-08-27T09:57:52.660 に答える
2

あなたの声明:

アニメーションの座標をいつでも取得することは不可能ですか?

間違っているようですこれを確認しましたか?

CALayerのpresentationLayerプロパティを使用して、アニメーション中に座標情報を抽出できるようです。

CGRect movingFrame = [[yourView.layer presentationLayer] frame];

この情報を使用して、アニメーション中に衝突が発生したかどうかを時々確認します。そのため、ビューをアニメーション化するためではなく、タイマーを使用して衝突ステータスを確認します。

于 2012-08-27T11:37:56.367 に答える
1

たとえば、beginAnimations-commitAnimations構文をforサイクルで使用できると思います。10までなので、各サイクルの後に衝突をチェックできます

CGRect incrementedViewFrame;

for(int i = 0; i < 10; ++i)
{

      incrementedViewFrame = CGRectMake(/*calculate the coords here*/);

      if(collision)
      {
           //do stuff
      }
      else
      {
           //do an other animation cycle
          [UIView beginAnimations:nil context:NULL];
          [UIView setAnimationBeginsFromCurrentState:YES];
          [UIView setAnimationDuration:0.1f];
          [[self viewToAnimate]setFrame:incrementedViewFrame];
          [UIView commitAnimations];
      }
}

お役に立てば幸いです。

于 2012-08-27T10:03:11.967 に答える