我正试图使这些框仅在touchesMoved事件后的水平和垂直线上移动。
如果盒子的中心位于当前网格块的中心,然后允许方向改变,我可以轻松检查每个触摸事件。但这将要求触摸非常精确,并且还可能因快速手指等而导致错误,然后错过触摸事件。
我必须做的是让盒子在网格中正确移动,即使你的触摸路径不是“完美”。见下图,蓝线表示箱子运动,绿线表示触摸路径。该框需要跟随最接近触摸路径的网格,因此看起来就像是在移动它。
我怎样才能做到这一点?
编辑:忘记提到盒子的移动应该是平滑的,而不是从网格跳到网格。
奖励信息:我还需要用触摸动量向左/向右/向上/向下滑动框,当然还有某种碰撞检测,因此框不能移动到网格上的其他框。我最好使用2d物理引擎吗?
答案 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);