0

我正在为 UIView 制作动画,并想检查它的框架是否与另一个 UIView 的框架相交。这就是我“生成”其中一个 UIView 的方式:

- (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 在屏幕上移动,但登录 oncomer1.frame 永远不会改变:它一直在输出Oncomer: {{50, 520}, {30, 60}}(这是动画后的值)。

有人知道为什么吗?

Ps 这两个方法都直接或间接调用 NSTimer,因此在后台执行

4

2 回答 2

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));
    }

}
于 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;

框架永不改变的一个合乎逻辑的解释是,您只是改变框架的 ,并且始终将其设置为由两个sy确定的相同值。height

于 2011-08-13T20:39:02.360 回答