Как плавно перемещать UIView пальцем пользователя на iOS - PullRequest
1 голос
/ 19 января 2012

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

Я реализовал это, используя touchesBegan, touchesMoved и touchesEnded. В TouchSMoved я перемещаю центр моего UIImageView в текущее местоположение касания и рисую линию с базовой графикой от последнего до текущего местоположения.

Это работает хорошо, но движение при просмотре изображения не очень плавное, и оно также отстает от прикосновения. Я уже пытался использовать UIPanGestureRecognizer (не распознал жест) и UIScrollView, в который я поместил мел (на самом деле не выяснил, как его настроить, чтобы он мог перемещаться достаточно далеко во всех направлениях). *

Можете ли вы дать мне несколько советов, как улучшить качество движения мела?

Спасибо!

Ответы [ 4 ]

1 голос
/ 15 июля 2016

Следующий метод метода tapGesture работает для меня гладко:

- (void)handlePan:(UIPanGestureRecognizer*)gesture{
View* view = (View*)gesture.view;

if (gesture.state == UIGestureRecognizerStateEnded){
    view.dragStartingPoint = CGPointZero;
    return;
}

CGPoint point = [gesture locationInView:gesture.view];

if (gesture.state == UIGestureRecognizerStateBegan){
    view.dragStartingPoint = point;
    view.dragStartingFrame = view.frame;

    return;
}

if (CGPointEqualToPoint(view.dragStartingPoint, CGPointZero))
    return;

CGFloat x = view.dragVerticallyOnly? view.frame.origin.x: view.dragStartingFrame.origin.x + point.x - view.dragStartingPoint.x;
CGFloat y = view.dragHorizontallyOnly? view.frame.origin.y: view.dragStartingFrame.origin.y + point.y - view.dragStartingPoint.y;

if (self.dragVerticallyOnly == NO){
    if (x < view.dragMinPoint.x){
        x = view.dragMinPoint.x;
    }
    else if (x  > self.dragMaxPoint.x){
        x = view.dragMaxPoint.x;
    }
}
if (self.dragHorizontallyOnly == NO){
    if (y < view.dragMinPoint.y){
        y = view.dragMinPoint.y;
    }
    else if (y  > self.dragMinPoint.y){
        y = view.dragMinPoint.y;
    }
}

CGFloat deltaX = x - view.frame.origin.x;
CGFloat deltaY = y - view.frame.origin.y;
if ((fabs(deltaX) <= 1.0 && fabs(deltaY) <= 1.0))
    return; // Ignore very small movements

[UIView animateWithDuration:0.1 animations:^{
    view.frame = CGRectMake(x, y, view.frame.size.width, view.frame.size.height);
}];

}

Наиболее важные моменты:

  1. Выполните движение с анимированнымвариант;(одна десятая секунды, кажется, хорошо выполняет свою работу).
  2. Избегайте движений, когда в этом нет необходимости.Выполнение некоторых вычислений не замедлит работу, но может привести к ненужным движениям.Однако вы не можете избежать многих движений, в противном случае он не будет следовать жесту панорамирования пользователя.

В зависимости от того, как вы хотите, чтобы ваш взгляд вел себя, может быть больше оптимизаций, которые вы можете захотеть сделать.

Примечание: Мой метод также учитывает границы и пределы направлений движения, которые вы можете определить в случае необходимости.Например, в моем случае я добавил ограничение скорости.Если пользователь выходит за пределы определенной скорости панорамирования, я просто игнорирую дальнейшие движения панорамирования и перемещаю вид (анимированный) туда, куда указывал пользователь, и с этой скоростью.Это может иметь или не иметь смысла в тех же случаях.По моему это так!

Надеюсь, мне помогли!

0 голосов
/ 19 января 2012

посмотрите на этот компонент: spuserresizableview http://cocoacontrols.com/platforms/ios/controls/spuserresizableview

Исходный код очень прост и может помочь вам понять обработку представления.

0 голосов
/ 01 июня 2012

Я переписал, как рассчитывается движение, и теперь оно немного плавнее. Не идеально, но этого достаточно.

0 голосов
/ 19 января 2012

Попробуйте уменьшить размер изображения Chalk, которое вы используете ....
Отредактировано:
Под размером я подразумевал размер файла изображения.
Мне помогло, когда я столкнулся с подобной проблемой.

...