iPhone:使用触摸开始、触摸移动和触摸结束平移移动图像

iPhone:使用触摸开始、触摸移动和触摸结束平移移动图像,iphone,input,Iphone,Input,我在视图中有一个包含9x9网格的图像。我想使用平移移动沿网格移动对象,网格由另一个数组(9)中的列数组(9)组成。图像应在网格中逐方移动。下面的代码是我到目前为止的代码。问题是图像一次跳跃3-4个方块。它太敏感了。有人能解释一下为什么要解决这个敏感问题,并提出一些建议吗 有效的代码: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject];

我在视图中有一个包含9x9网格的图像。我想使用平移移动沿网格移动对象,网格由另一个数组(9)中的列数组(9)组成。图像应在网格中逐方移动。下面的代码是我到目前为止的代码。问题是图像一次跳跃3-4个方块。它太敏感了。有人能解释一下为什么要解决这个敏感问题,并提出一些建议吗

有效的代码:

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

    // Do not move if touch is off the grid
    if (gestureStartPoint.x < 0 || 
        gestureStartPoint.x > 450 || 
        gestureStartPoint.y < 0 || 
        gestureStartPoint.y > 450) {
        canMove = NO;
    }else {
        canMove = YES;
    }
}

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

    double thresholdX = 50;

    if (canMove) { 
        deltaX = (int)(currentPosition.x - gestureStartPoint.x); 
        if (deltaX > thresholdX) {
            deltaX = 0; 
            if([self blockCanMoveXDir:1]){
                [cBlock movX:1];
            }
            // Resets start point 
            gestureStartPoint = currentPosition; 
            NSLog(@"-------------> Block Moved"); 
        } else if(deltaX < 0 && fabs(deltaX) > thresholdX) {
            deltaX = 0; 
            if([self blockCanMoveXDir:-1]){
                [cBlock movX:-1];
            }
            gestureStartPoint = currentPosition; 
        }
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    canMove = NO;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    canMove = NO;
}
-(void)touchesbeated:(NSSet*)toucheevent:(UIEvent*)event{
UITouch*touch=[触摸任何对象];
gestureStartPoint=[触摸位置视图:self.view];
//如果触摸屏脱离网格,请勿移动
如果(手势起始点x<0 | |
手势起始点.x>450 | |
手势起始点y<0 | |
手势起始点(y>450){
canMove=NO;
}否则{
canMove=是;
}
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
UITouch*touch=[触摸任何对象];
CGPoint currentPosition=[触摸位置视图:self.view];
双阈值x=50;
如果(可以移动){
deltaX=(int)(currentPosition.x-gestureStartPoint.x);
如果(deltaX>阈值X){
deltaX=0;
if([self-blockCanMoveXDir:1]){
[cBlock movX:1];
}
//重置起点
gestureStartPoint=当前位置;
NSLog(@“------------>块移动”);
}else if(deltaX<0&&fabs(deltaX)>thresholdX){
deltaX=0;
if([self-blockCanMoveXDir:-1]){
[cBlock movX:-1];
}
gestureStartPoint=当前位置;
}
}
}
-(无效)触控取消:(NSSet*)触控事件:(UIEvent*)事件{
canMove=NO;
}
-(void)touchesend:(NSSet*)toucheevent:(UIEvent*)event{
canMove=NO;
}

我认为在
if(canMove){
下面,你应该累积移动量。让我解释一下,你应该这样计算移动量的绝对增量:

deltaX = currentPosition.x - gestureStartPoint.x;
其中deltaX是一个类变量。当该值大于阈值时,您将执行一个块移动。调整该阈值可以更改灵敏度。
当然,您还必须考虑Y组件。

我已经尝试过了,而且它的移动速度也太快了。我认为touchsmoved被调用的次数太多了。这不是touchsmoved被调用的频率的问题。这只是阈值的问题,试试这个:if(canMove){deltaX=(int)(currentPosition.x-gestureStartPoint.x);如果(deltaX>thresholdX){deltaX=0;//TODO:Move one block//Reset start point gestureStartPoint=currentPosition;NSLog(@“------------>block Moved”);}…您的代码…非常接近。我想我从这里得到了它。非常感谢。