简体   繁体   English

平滑移动和捏住UIImageView

[英]Smooth move and pinch of UIImageView

I have an image view that I want to be able to move around, and pinch to stretch it. 我有一个图像视图,希望能够四处移动并捏住以拉伸它。 It's all working, but it's kinda jumpy when I start to do any pinch movements. 一切正常,但是当我开始做捏动作时有点跳动。 The position will jump back and forth between the two fingers. 该位置将在两个手指之间来回跳跃。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    startLocation = [[touches anyObject] locationInView:mouth_handle];
    if([touches count] == 2) {
        NSArray *twoTouches = [touches allObjects];
        UITouch *first = [twoTouches objectAtIndex:0];
        UITouch *second = [twoTouches objectAtIndex:1];
        initialDistance = distanceBetweenPoints([first locationInView:mouth_handle],[second locationInView:mouth_handle]);
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    CGPoint pt = [[touches anyObject] locationInView:mouth_handle];

    CGRect frame = [mouth_handle frame];

    frame.origin.x += pt.x - startLocation.x;
    frame.origin.y += pt.y - startLocation.y;

    frame.origin.x = (frame.origin.x < 58) ? 58 : frame.origin.x;
    frame.origin.x = (frame.origin.x > (260 - mouth_handle.frame.size.width)) ? (260 - mouth_handle.frame.size.width) : frame.origin.x;
    frame.origin.y = (frame.origin.y < 300) ? 300 : frame.origin.y;
    frame.origin.y = (frame.origin.y > 377) ? 377 : frame.origin.y;

    if(frame.origin.x - prevDistanceX > 2 && frame.origin.x - prevDistanceX < -2)
        frame.origin.x = prevDistanceX;
    if(frame.origin.y - prevDistanceY > 2 && frame.origin.y - prevDistanceY < -2)
        frame.origin.y = prevDistanceY;

    prevDistanceX = frame.origin.x;
    prevDistanceY = frame.origin.y;

    CGFloat handleWidth = mouth_handle.frame.size.width;

    if([touches count] == 2) {
        NSArray *twoTouches = [touches allObjects];
        UITouch *first = [twoTouches objectAtIndex:0];
        UITouch *second = [twoTouches objectAtIndex:1];
        CGFloat currentDistance = distanceBetweenPoints([first locationInView:mouth_handle],[second locationInView:mouth_handle]);

        handleWidth = mouth_handle.frame.size.width + (currentDistance - initialDistance);
        handleWidth = (handleWidth < 60) ? 60 : handleWidth;
        handleWidth = (handleWidth > 150) ? 150 : handleWidth;
        if(initialDistance == 0) {
            initialDistance = currentDistance;
        }

        initialDistance = currentDistance;
    }

    mouth_handle.frame = CGRectMake(frame.origin.x, frame.origin.y, handleWidth, 15);
}

Any thoughts on how to make this smoother? 关于如何使它更平滑有什么想法?

You can do this using a UIScrollview; 您可以使用UIScrollview进行此操作; it's built into that directly. 它直接内置在其中。

By jumping between the fingers, do you mean that you can't distinguish between the first and the second finger? 通过在手指之间跳跃,您是说无法区分第一根和第二根手指吗?

What I would do is calculate the angle between the fingers. 我要做的是计算手指之间的角度。 By angle I mean that if you would draw a circle with one touch as the center and the other on the edge of the circle, you could determine the angle between the point right above the first touch and the second touch. 角度是指如果您以一个触摸为中心绘制一个圆,另一个在圆的边缘绘制一个圆,则可以确定第一次触摸上方的点与第二次触摸之间的角度。 If the angle difference between two events is bigger than .5Pi (1/4 circle) you can assume the touches got switched and you could correct for that. 如果两个事件之间的角度差大于0.5Pi(1/4圈),则可以假定触摸已切换,可以对此进行校正。

I hope you understand what I mean. 我希望你明白我的意思。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM