CGRectContainsPoint不返回YES,但在模拟器上,该点位于图像中

时间:2014-06-07 16:57:58

标签: ios objective-c cgrect

在viewDidLoad中,我正在创建一个名为DeepFryingBasket的imageView。您可以用手指左右移动篮子,但不能向上或向下移动篮子。我的第二张图片是一个落在屏幕上的法国朋友。如果这个朋友和篮子发生碰撞,这个朋友应该会消失,所以它看起来像是落在了篮子里。这就是为什么我有一个NSTimer每隔0.01秒触发一次CollisionDetection方法。

问题是当我用篮子抓住法国朋友时,朋友不会消失。 我确信调用了collisionDetection方法,但编译器永远不会进入if语句,我不知道为什么。任何帮助都会非常感激!

- (void)viewDidLoad
{
    [super viewDidLoad];
    DeepFryingBasket =[[UIImageView alloc] initWithFrame:CGRectMake(110,468,100,80)];
    DeepFryingBasket.image = [UIImage imageNamed:@"DeepFryingBasket"];
    [self.view addSubview:DeepFryingBasket];
    CollisionDetection = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(collisionDetection) userInfo:nil repeats:YES];
    [CollisionDetection fire];
}

-(void)collisionDetection{
    if (CGRectContainsPoint (FrenchFrie.frame, DeepFryingBasket.center)){
        [FrenchFrie removeFromSuperview];
        points = points + 1;
        dropped = dropped +1;
    }
}

我使用以下代码移动篮子:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    touchLocation = [touch locationInView:self.view];
    frame = DeepFryingBasket.frame;
    if (CGRectContainsPoint(frame, touchLocation)){
        DeepFryingBasket.center = CGPointMake(touchLocation.x, DeepFryingBasket.center.y);
    }
}

编辑:我也尝试添加

    DeepFryingBasket.userInteractionEnabled = YES;

但这并没有太大变化。 我还发现,当法国朋友用动画拍摄时,图像的起源并没有改变。为什么不改变?我注意到,当我移动篮子时,它的中心与我的手指一起移动。 我使用以下代码移动法国朋友:

-(void)letFrenchFrieFall {
    [UIView animateWithDuration:10.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
    FrenchFrie.frame = CGRectMake(randomX, (int)[[UIScreen mainScreen] bounds].size.height + 40, FrenchFrie.frame.size.width, FrenchFrie.frame.size.height);
    } completion:^(BOOL finished){
        [FrenchFrie removeFromSuperview];
    }];
}

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了自己问题的答案: 当imageView由于动画而移动时,x和Y坐标被设置为动画结束的位置;因此,

无法获得它的位置
FrenchFrie.frame

您可以使用

FrenchFrieFrame = [[FrenchFrie.layer presentationLayer] frame];

获取当前显示的帧。 别忘了包含Quartzcore Framework并导入它。

#import <QuartzCore/QuartzCore.h>