Ускорение элементов с помощью прикосновений - PullRequest
1 голос
/ 22 октября 2011

У меня есть UIImageView, который я пытаюсь ускорить в зависимости от расстояния, на которое оно было перемещено, и от того, насколько быстро оно было перемещено. Под ускорением я подразумеваю, что когда вызывается touchesEnded:, imageView должен двигаться дальше в том направлении, в котором он был перетащен. Как далеко и как быстро он должен скользить, зависит от расстояния и скорости, с которой он был перемещен.

На данный момент я могу перетащить изображение и получить расстояние, на которое оно было перетащено + сколько времени это заняло. На основании этого я могу рассчитать скорость и вектор направления.

Но я борюсь со слайдом, выполненным на изображении при помощи прикосновений к закруглению.

Мои вопросы: есть ли какой-нибудь общий или умный способ выполнить этот «скользящий» эффект на UIImageView, который я пытаюсь сделать?

Я с радостью приму любое решение или совет, который может помочь.

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2011

Решение этой проблемы намного проще, чем я ожидал.Вот что я придумал (это простая версия, без всякого причудливого кода):

@interface myViewController {
    CGPoint _velocity;
    CGFloat _damping;
    UIImageView *_myImageView;
}

- (void)viewDidLoad {
    _velocity = CGPointZero; // x = 0, y = 0

   // Accelerate _myImageView 
   NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:0.02f // Update frequency 
                                               target:self 
                                             selector:@selector(slideImageView) 
                                             userInfo:nil 
                                              repeats:YES];
}

@implementation myViewController

- (void)slideImageView {
    // No need to move _myImageView when _velocity = 0
    if (_velocity.x > 0 && _velocity.y > 0)
        CGPoint position; // The next position
        position = _myImageView.center;

        position.x += _velocity.x / 30;
        position.y += _velocity.y / 30;

        // Damp _velocity with damping factor
        _velocity.x *= _damping;
        _velocity.y *= _damping;

        // Bounce on edges
        if (position.x < X_AXIS_MIN_VALUE || position.x > X_AXIS_MAX_VALUE)
            _velocity.x = -_velocity.x;

        if (position.y < Y_AXIS_MIN_VALUE || position.y > Y_AXIS_MAX_VALUE)
            _velocity.y = -_velocity.y;

        // Move 
        _myImageView.center = position;
    }
}

// Move been around by implementing touchesBegan: and touchesMoved:
// There are a million tutorials on how to do this.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    // Do whatever you need to do and calculate x- and y-axis velocity,
    // maybe based on the distance between the last 5 points / time.
    CGPoint mySpeed;
    mySpeed.x = //the new x speed;
    mySpeed.y = //the new y speed
    _velocity = mySpeed;
}

@end

Приведенный выше код (+ отсутствующая реализация) позволяет перетаскивать UIImageView по экрану.,Когда вы отпустите палец, ImageView продолжит скользить по экрану, отскакивая по краям, если они попали.Чем быстрее вы двигаете пальцем, тем больше будет ускоряться ImageView (ну, в зависимости от того, как вы рассчитываете скорость).

Я надеюсь, что любой, кто боролся с такой проблемой, найдет ее полезной.

...