2012-01-19 3 views
1

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

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

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

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

Спасибо!

ответ

-2

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

+2

Эй, как вы получили решение?Пожалуйста, помогите мне. Я столкнулся с такой же проблемой. –

+0

Я уменьшил размер и производительность других частей контроллера. Помог немного, но, как я сказал, не совсем совершенен. Имейте в виду, что это было давно ... В этом учебнике показано, как рисовать гладко: http://code.tutsplus.com/tutorials/smooth-freehand-drawing-on-ios--mobile-13164 Я думаю, что вы могут адаптировать некоторые из упомянутых методов. Может быть, это помогает. – Cornelius

0

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

+0

Я решительно удалил размер, но он все еще отстает, и движение не очень гладко. Также изменение размера на самом деле не является вариантом, поскольку оно является частью дизайна ... – Cornelius

+0

Как насчет размера файла. – Dancreek

1

Следующий метод метод 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. Избегайте движения, если это не необходимо. Выполнение некоторых расчетов не замедлит работу, но может потребовать ненужных движений. Однако вы не можете избежать многих движений, иначе он не будет следовать жестом жесты пользователя.

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

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

Надеюсь, что я помог!

Смежные вопросы