iPhone - 惯性拖动

时间:2011-10-16 21:52:08

标签: iphone ios

我有一个用户必须在屏幕上拖动的对象。这是一个常规的UIImageView。目前,图像可以被拖动,但是当你释放它时,它会停在手指抬起图像的地方。我想要的是创造动量,所以我可以给图像一个冲动,它滚动直到它反弹屏幕边缘。

我不想要像添加物理库那样复杂的东西。我希望尽可能减少它。

我该怎么做?你们能指点我一些教程或正确的方向吗?

感谢。

1 个答案:

答案 0 :(得分:3)

这样做的一种方法是不使用任何物理库:

在你的班级中首先创建4个这样的实例变量:

CFTimeInterval startTime;
CGPoint startPoint;
CGPoint oldPoint;
BOOL imageViewTouched;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event方法中的代码更多:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouched] anyObject];
    // Test to see if the touched view is your image view. If not just return.
    if (touch.view != <#yourImageView#>) {
        return;
    }

    startPoint = [touch locationInView:self.view];
    oldPoint = startPoint;
    startTime = CACurrentMediaTime();
    imageViewTouched = YES;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event执行此操作:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Fingers were moved on the screen but your image view was not touched in the beginning
    if (!imageViewTouched) {
        return;
    }

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint newPoint = [touch locationInView:self.view];

    <#yourImageView#>.frame = CGRectOffset(<#yourImageView#>.frame, newPoint.x - oldPoint.x, newPoint.y - oldPoint.y);
    oldPoint = newPoint;
}

现在- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event试试这个:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Fingers were removed from the screen but your image view was not touched in the beginning
    if (!imageViewTouched) {
        return;
    }

    imageViewTouched = NO;

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint endPoint = [touch locationInView:self.view];
    CFTimeInterval endTime = CACurrentMediaTime();

    CFTimeInterval timeDifference = endTime - startTime;

    // You may play with this value until you get your desired effect
    CGFloat maxSpeed = 80;

    CGFloat deltaX = 0;
    CGFloat deltaY = 0;

    if (timeDifference < 0.35) {
        deltaX = (endPoint.x - startPoint.x) / (timeDifference * 10);
        deltaY = (endPoint.y - startPoint.y) / (timeDifference * 10);
    }

    if      (deltaX > maxSpeed)         { deltaX =  maxSpeed; }
    else if (deltaX < -maxSpeed)        { deltaX = -maxSpeed; }
    else if (deltaX > -5 && deltaX < 5) { deltaX = 0; }

    if      (deltaY > maxSpeed)         { deltaY =  maxSpeed; }
    else if (deltaY < -maxSpeed)        { deltaY = -maxSpeed; }
    else if (deltaY > -5 && deltaY < 5) { deltaY = 0; }

    [UIView begginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

    <#yourImageView#>.frame = CGRectOffset(<#yourImageView#>.frame, deltaX, deltaY);

    [UIView commitAnimations];
}

如果这有意义和/或适合您,请告诉我。干杯!