Плавное движение и щепотка UIImageView - PullRequest
0 голосов
/ 25 марта 2010

У меня есть изображение, которое я хочу перемещать и сжимать, чтобы растянуть. Это все работает, но это немного нервно, когда я начинаю делать какие-либо щепотки. Положение будет прыгать вперед и назад между двумя пальцами.

- (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);
}

Есть мысли о том, как сделать это более плавным?

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Прыгая между пальцами, вы имеете в виду, что не можете различить первый и второй пальцы?

Что бы я сделал, это вычислил угол между пальцами. Под углом я подразумеваю, что если бы вы нарисовали круг с одним касанием в качестве центра, а другое - по краю круга, вы могли бы определить угол между точкой, находящейся прямо над первым касанием и вторым касанием. Если разность углов между двумя событиями больше, чем .5Pi (1/4 окружности), вы можете предположить, что касания были переключены, и вы могли бы исправить это.

Надеюсь, вы понимаете, о чем я.

0 голосов
/ 26 марта 2010

Вы можете сделать это с помощью UIScrollview;это встроено в это напрямую.

...