2011-08-13 5 views
0

私はUIViewをアニメーション化していて、そのフレームが別のUIViewのフレームと交差しているかどうかをチェックしたいと思います。これは、私がUIViewの "スポーン"する方法です:アニメーション中にCGRectが変化しない

- (void) spawnOncomer 
{  
oncomer1 = [[Oncomer alloc] initWithType:@"car"]; 
    [self.view addSubview:oncomer1]; 


    //make the oncomer race across the screen 
    [UIView beginAnimations:nil context:NULL]; { 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [UIView setAnimationDuration:3.0]; 
     [UIView setAnimationDelegate:self]; 
     CGRect f = oncomer1.frame; 
     f.origin.y = self.view.frame.size.height+oncomer1.frame.size.height; 
     oncomer1.frame = f; 
     [UIView setAnimationDidStopSelector:@selector(decountCar)]; 
    } 
    [UIView commitAnimations]; 
} 

これまでのところとても良いです。今私は、このUIViewと私の他のUIViewがこれを行うことによって衝突するかどうか確認したい:

- (void) checkCollision { 

    bool collision = CGRectIntersectsRect(car.frame, oncomer1.frame); 
    if (collision) { 
     NSLog(@"BOOOOOOOM"); 
    } else { 
     NSLog(@"Oncomer: %@", NSStringFromCGRect(oncomer1.frame)); 
    } 

} 

しかし、それらは決して衝突しない。 oncomer1が画面を横切って移動するのを見ても、loggin oncomer1.frameは決して変更されません。Oncomer: {{50, 520}, {30, 60}}(ポストアニメーション値)を出力し続けます。

これはなぜですか?

p.s.どちらの方法は、NSTimerと直接的または間接的に呼び出されており、したがって、あなたのコードから背景

+0

のNSLog(:、NSStringFromCGRect(oncomer1.frame)の "%@ Oncomer" @)何;アニメーションが完了した後の出力? – msgambel

+0

その値。私はそれがアニメーション後の価値であることを理解しました。 'oncomer1.frame'は、アニメーションが始まるとすぐにこの値に設定されます。 –

+0

アニメーション中のフレームとは対照的に、ビューの中心を見るのは良い考えです。 checkCollisionメソッドの中心点に基づいてrectを作成して、それが機能するかどうか調べてみませんか?最初に、アニメーション中に変化するかどうかをNSLoggingで確認してください。 – msgambel

答えて

3

UIViewジオメトリの更新は、アニメーションブロック内であっても、CALayerにすぐに適用されます。適用されるアニメーションで層のバージョンを取得するには、-[CALayer presentationLayer]を使用することができ、このような(警告 - 未テストコード):

- (void) checkCollision { 
    CGRect oncomerFrame = oncomer1.layer.presentationLayer.frame; 
    bool collision = CGRectIntersectsRect(car.frame, oncomerFrame); 
    if (collision) { 
     NSLog(@"BOOOOOOOM"); 
    } else { 
     NSLog(@"Oncomer: %@", NSStringFromCGRect(oncomerFrame)); 
    } 

} 
0

で実行されます。

CGRect f = oncomer1.frame; 
f.origin.y = self.view.frame.size.height+oncomer1.frame.size.height; 
oncomer1.frame = f; 

フレームの論理的な説明は変更はありません、あなただけのyを変更しているということですフレームであり、常に2つのheightによって決まる同じ値に設定されています。

関連する問題