0

UIViewをアニメートしていて、そのフレームが別のUIViewのフレームと交差しているかどうかを確認したいと思います。これは、UIViewの1つを「スポーン」する方法です。

- (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}}(アニメーション後の値です)。

なぜこれなのか誰か知っていますか?

Ps両方のメソッドはNSTimerを使用して直接または間接的に呼び出されるため、バックグラウンドで実行されます

4

2 に答える 2

3

UIViewCALayerジオメトリの更新は、アニメーションブロックであっても、すぐに適用されます。アニメーションが適用されたレイヤーのバージョンを取得するには、次のように使用できます-[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));
    }

}
于 2011-08-13T22:44:54.277 に答える
0

あなたのコードから:

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

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

于 2011-08-13T20:39:02.360 に答える