Перетащите UIVIew относительно пальца

У меня небольшая проблема. У меня есть UIView, и я могу перетаскивать их с помощью методов touchesBegan и touchesMoved.

Моя проблема в том, что мои координаты UIView (0,0) попадают под мой палец. Я хотел бы избежать этого.

Вы знаете, как это сделать? Я пробую некоторые вещи, но безуспешно :(

Большое спасибо !


person Pierre    schedule 21.06.2011    source источник


Ответы (2)


Это будет зависеть от размера представления, но вы, вероятно, можете установить свойство center для местоположения вашего прикосновения.

Анимация центра по месту касания

[UIView animateWithDuration:0.25f
                      delay:0.0f
                    options:(UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut)
                 animations:^{
                     theView.center = tapLocation;
                 }
                 completion:NULL]

Вместо того, чтобы просто перемещать местоположение или переводить его, вы можете анимировать представление в соответствии с вашим текущим касанием во всех touches* методах.

person Deepak Danduprolu    schedule 21.06.2011
comment
Это вызовет эффект прыжка. Я хотел бы, чтобы вид точно следовал моему пальцу, где я приклеил его в первый раз. - person Pierre; 21.06.2011
comment
О, так вы хотите анимировать его в свою позицию? - person Deepak Danduprolu; 21.06.2011
comment
Не могли бы вы просто вычислить разницу между начальным касанием и центром и вычесть ее из значения touchesMoved? - person Jake; 21.06.2011
comment
Да, это ваше решение хорошее. Большое спасибо. Я не думал о сохранении разницы. Еще раз спасибо :) - person Pierre; 21.06.2011

когда вы нажимаете пальцем, сохраняйте точку

затем измерьте скорость перетаскивания и примените скорость к положению вашего взгляда (я перевожу свое представление с источником в моем примере)

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSUInteger touchCount = [touches count];
    NSUInteger tapCount = [[touches anyObject] tapCount];
    NSLog(@"touchesBegan");
    NSLog(@"%d touches", touchCount);
    NSLog(@"%d taps", tapCount);

    UITouch *touch = [touches anyObject];
    pNow = [touch locationInView:self];
    pLast = [touch locationInView:self];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSUInteger touchCount = [touches count];
    NSUInteger tapCount = [[touches anyObject] tapCount];
    NSLog(@"touchesMoved");
    NSLog(@"%d touches", touchCount);
    NSLog(@"%d taps", tapCount);

    UITouch *touch = [touches anyObject];
    pNow = [touch locationInView:self];

    mouseSpeed.x = pNow.x - pLast.x;
    mouseSpeed.y = pNow.y - pLast.y;
    NSLog(@"mouseSpeed : %f, %f", mouseSpeed.x, mouseSpeed.y);

    origin.x += mouseSpeed.x;
    origin.y += mouseSpeed.y;
    NSLog(@"origin : %f, %f", origin.x, origin.y);

    //copy point for the next update
    pLast = pNow;
}
person Marc    schedule 17.08.2012