Ios flick motion和UIPangestureRecognitor的意外结果

Ios flick motion和UIPangestureRecognitor的意外结果,ios,objective-c,uigesturerecognizer,sprite-kit,uipangesturerecognizer,Ios,Objective C,Uigesturerecognizer,Sprite Kit,Uipangesturerecognizer,我正在使用下面的代码在SpriteKit场景中实现对精灵的轻弹,以便它们根据UIPangestureRecognitor中手指的运动继续在屏幕上移动和滑动 在大多数情况下,它工作得很好,但是当我靠近屏幕可视区域的边缘并尝试此手势将精灵弹离屏幕时,它会产生相反的效果,并将精灵推回中心而不是屏幕外 谁能告诉我为什么当精灵离屏幕边缘太近时,它会被推回而不是像预期的那样弹离屏幕 if (recognizer.state == UIGestureRecognizerStateEnded) { if

我正在使用下面的代码在SpriteKit场景中实现对精灵的轻弹,以便它们根据UIPangestureRecognitor中手指的运动继续在屏幕上移动和滑动

在大多数情况下,它工作得很好,但是当我靠近屏幕可视区域的边缘并尝试此手势将精灵弹离屏幕时,它会产生相反的效果,并将精灵推回中心而不是屏幕外

谁能告诉我为什么当精灵离屏幕边缘太近时,它会被推回而不是像预期的那样弹离屏幕

if (recognizer.state == UIGestureRecognizerStateEnded) {
    if ([touchedNode.name isEqualToString:@"sprite"]) {
        SKSpriteNode *touchedSprite = (SKSpriteNode *)touchedNode;
        // Calculate the length of the velocity vector (i.e. the magnitude)
        CGPoint velocity = [recognizer velocityInView:self.view];
        CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
        CGFloat slideMult = magnitude / 200;
        NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);

        // Calculate a final point based on the above
        float slideFactor = 0.1 * slideMult;    // Increase for more of a slide
        CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), recognizer.view.center.y - (velocity.y * slideFactor));

        SKAction *moveAction = [SKAction moveTo:finalPoint duration:slideFactor * 2];
        [moveAction setTimingMode:SKActionTimingEaseOut];
        [touchedSprite runAction:moveAction];
    }
}

我认为这是有可能的,你忘了把你的观点从视角转换成场景

让我们假设我们初始化了我们的手势

__weak IBOutlet SKView      *skView;
...
panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[skView addGestureRecognizer:panRecognizer];
所以,如果我们想在SpriteKit空间中获得这个手势识别器的触摸位置,我们必须将这个点从视图转换到场景

- (void)handlePan:(UIPanGestureRecognizer*)sender{

CGPoint point = [sender locationInView:skView];
point = [skView.scene convertPointFromView:point];

// do your things here

}

问题在于,最终
CGPoint
的计算基于添加
uipangestrerecognizer
的位置。在这种情况下,必须将其添加到SKView中,因为
SKSpriteNode
不是
UIView
子类,因此不能向其添加
uipangestrerecognizer

这是上面的旧计算

CGPoint finalPoint = 
 CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), 
             recognizer.view.center.y - (velocity.y * slideFactor));
下面是使用精灵节点的中心作为计算基础所做的更改

CGPoint finalPoint = 
 CGPointMake(touchedSprite.position.x 
              + (touchedSprite.size.width / 2) 
              + (velocity.x * slideFactor), 
             touchedNode.position.y 
              + (touchedNode.size.height / 2) 
              - (velocity.y * slideFactor));

你有我可以下载的项目来测试这个吗?记录速度。。。轻弹开始在屏幕上,但手指离开屏幕会取消手势识别,可能这会返回错误的速度。对不起,我已经这样做了,我忽略了将此添加到我的问题中。