我编写了一些限制框(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;
}
答案 0 :(得分:0)
不要使用相对偏移运动。相反,使用实际触摸位置作为所需位置,然后根据网格限制绑定(修改)它。通过这种方式,你不会在触摸后留下任何延迟。
从你的碰撞检测中我猜想必须遵循一条路径,一个天真的实现将“跳过”视图跨越边界触摸。一个简单的解决方案是将跳跃限制到最大半个网格平方(因此如果用户放下它,用户必须将触摸带回视图)。