touchesMoved,我如何让我的观点赶上来 - 并留在手指下?

时间:2014-01-03 15:23:31

标签: ios objective-c cocoa-touch collision-detection multi-touch

我编写了一些限制框(UIView)移动到网格的代码。

当移动盒子时,移动被锁定在网格上,如果您沿着对角线或非常快的速度拖动,盒子就会开始落在手指后面。

那么最好的方法是编写一个方法让盒子赶上并回到手指下 - 它必须在与手指相同的路径上移动 - 并且它也必须不会移动通过其他盒子,所以它需要碰撞检测 - 所以我不能将Animate做到新的中心点。

有什么建议吗?

这是当前正在使用的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.superview];

    lastLocation = location;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.superview];

    CGPoint offset = CGPointMake(self.center.x + location.x - lastLocation.x, self.center.y + location.y - lastLocation.y);
    CGPoint closestCenter = [self closestCenter:offset];
    CGRect rect = CGRectMake(offset.x - (self.size.width / 2), offset.y - (self.size.height / 2), self.size.width, self.size.height);

    if (fabsf(closestCenter.x - offset.x) < fabsf(closestCenter.y - offset.y)) {
        offset.x = closestCenter.x;
    }
    else {
        offset.y = closestCenter.y;
    }

    // Do collision detection - removed for clarity

    lastLocation = location;
    self.center = offset;
}

1 个答案:

答案 0 :(得分:0)

不要使用相对偏移运动。相反,使用实际触摸位置作为所需位置,然后根据网格限制绑定(修改)它。通过这种方式,你不会在触摸后留下任何延迟。

从你的碰撞检测中我猜想必须遵循一条路径,一个天真的实现将“跳过”视图跨越边界触摸。一个简单的解决方案是将跳跃限制到最大半个网格平方(因此如果用户放下它,用户必须将触摸带回视图)。