2012-02-17 2 views
1

Этого вопрос имеет какое-то отношение к этому сообщению я сделал недавно: Drag a UIView part-way, then it moves on its ownпределов положения Установки для перетаскиваемого UIView при использовании UIPanGestureRecognizer

Короче говоря, у меня есть перемещаемый вид UI частично видимый в нижней части окна. Существует вкладка «pull», которую пользователь может использовать для перетаскивания изображения вверх или вниз по экрану. Я поставил ограничения на положение Y для верхних и нижних позиций, используя этот код, но я понятия не имею, если это правильный способ сделать это:

- (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    UIView *piece = [gestureRecognizer view]; 
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) 
    { 
     CGPoint velocity = [gestureRecognizer velocityInView:[piece superview]]; 
     CGPoint translation = [gestureRecognizer translationInView:[piece superview]]; 

     if(velocity.y < 0) //user is dragging the view upwards the screen 
     { 
      // Set the maximum Ypos as the top 1/3rd of the screen 
      CGFloat maxYPos = self.view.frame.size.height/3; 
      if(blogTextView.frame.origin.y >= maxYPos) 
      { 
       [piece setCenter:CGPointMake([piece center].x, [piece center].y + translation.y)]; 
       [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]]; 
      } 
     } 
     else 
     { 
      // User is dragging the view downwards the screen 
      // Set the lowest Y position to be 420 
      if(blogTextView.frame.origin.y <= 420) //size of remaining view 
      { 
       [piece setCenter:CGPointMake([piece center].x, [piece center].y + translation.y)]; 
       [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]]; 
      } 
     } 
    } 

}

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

Есть ли правильный способ установить пределы того, как далеко можно перетащить представление, и будет ли он правильно обрабатываться в этом обратном вызове gestureRecognizer?

Для справки, вот фото тестового приложения:

Default screen with draggable view at the bottom and the pull tab

View dragged up to its correct max Y position

Спасибо!

+0

Можете ли вы объяснить, что такое ** blogTextView ** и ** штука **? – sch

ответ

2

Проблема заключается в том, что в следующем коде:

if(blogTextView.frame.origin.y >= maxYPos) 
{ 
    [piece setCenter:CGPointMake([piece center].x, [piece center].y + translation.y)]; 
    [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]]; 
} 

И этот:

if(blogTextView.frame.origin.y <= 420) //size of remaining view 
{ 
    [piece setCenter:CGPointMake([piece center].x, [piece center].y + translation.y)]; 
    [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]]; 
} 

Вы вы должны использовать будущую стоимость blogTextView.frame.origin.y (значение, которое вы бы получить, если выполняется код внутри блока if.)

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

+0

К сожалению, я написал разъяснение, но сейчас понимаю. Спасибо!! – kurisukun

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