Следующий метод метода 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);
}];
}
Наиболее важные моменты:
- Выполните движение с анимированнымвариант;(одна десятая секунды, кажется, хорошо выполняет свою работу).
- Избегайте движений, когда в этом нет необходимости.Выполнение некоторых вычислений не замедлит работу, но может привести к ненужным движениям.Однако вы не можете избежать многих движений, в противном случае он не будет следовать жесту панорамирования пользователя.
В зависимости от того, как вы хотите, чтобы ваш взгляд вел себя, может быть больше оптимизаций, которые вы можете захотеть сделать.
Примечание: Мой метод также учитывает границы и пределы направлений движения, которые вы можете определить в случае необходимости.Например, в моем случае я добавил ограничение скорости.Если пользователь выходит за пределы определенной скорости панорамирования, я просто игнорирую дальнейшие движения панорамирования и перемещаю вид (анимированный) туда, куда указывал пользователь, и с этой скоростью.Это может иметь или не иметь смысла в тех же случаях.По моему это так!
Надеюсь, мне помогли!