限制图像移动到网格

时间:2013-09-08 10:00:41

标签: iphone ios objective-c cocoa-touch uiimageview

我正试图使这些框仅在touchesMoved事件后的水平和垂直线上移动。

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

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

我怎样才能做到这一点?

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

Image

Video

奖励信息:我还需要用触摸动量向左/向右/向上/向下滑动框,当然还有某种碰撞检测,因此框不能移动到网格上的其他框。我最好使用2d物理引擎吗?

2 个答案:

答案 0 :(得分: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;
         }
      }
   }
}

答案 1 :(得分: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);