0

我试图让盒子在 touchesMoved 事件之后只在水平和垂直线上移动。

如果框的中心位于当前网格块的中心,我可以轻松检查每个触摸事件,然后允许改变方向。但这将要求触摸非常精确,并且还可能由于手指快速等而导致错误,然后错过触摸事件。

我最想做的是让盒子在网格中正确移动,即使你的触摸路径不是“完美的”。见下图,蓝线表示盒子移动,绿线是触摸的路径。该框需要遵循最靠近触摸路径的网格,因此看起来就像您在移动它。

我怎样才能做到这一点?

编辑:忘了提盒子的移动应该是平滑的,而不是从一个网格跳到另一个网格。

图片

视频

额外信息:我还需要使用触摸动量向左/右上/下轻弹框,当然还有某种碰撞检测,所以框不能穿过网格上的其他框。使用 2d 物理引擎会更好吗?

4

2 回答 2

0

假设您的网格块位于 gridContainerView 尝试这种方法

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
   for (UITouch *touch in touches) {
      CGPoint touchPoint = [touch locationInView: gridContainerView];
      for (UIView *subView in gridContainerView.subviews) {
         if (conditionForBeingAGridBlock && 
               CGRectContainsPoint(subview.frame, touchPoint)) {
            box.frame = subview.frame;
         }
      }
   }
}
于 2013-09-08T14:01:42.817 回答
0

基于hacker2007的流畅动画回答:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
   UITouch *aTouch = [touches anyObject];
   CGPoint location = [aTouch locationInView:gridContainerView];
   for (UIView *subView in gridContainerView.subviews) {
      if (conditionForBeingAGridBlock && CGRectContainsPoint(subview.frame, touchPoint))       
      {
          [UIView beginAnimations:@"Dragging A DraggableView" context:nil];
          self.frame = CGRectMake(0, location.y, subview.frame.size.width, subview.frame.size.height);
          [UIView commitAnimations];
      }
   }
}

这将移动您在手指下拖动的视图,您可以自己添加检查以确保它不会去它不能去的地方。但这将使您获得平滑的拖动动画。


似乎问题在于您在动画中将框架设置为:目前,每次您稍微移动正方形时,您都会在这里获得一个新的矩形:

CGRect rect = [self.grid getCellRect:self.grid.gridView x:cell.x y:cell.y];

然后在你的动画中你这样做:

self.frame = rect;

然后将框设置为该矩形。因此,如果您非常快速地移动手指,那么您将获得“跳过”效果。如果你把它改成这样:

self.frame = CGRectMake(location.x - self.bounds.size.width / 2, location.y - self.bounds.size.height / 2, self.bounds.size.width, self.bounds.size.height);
于 2013-09-09T09:12:25.003 回答