Установка пределов положения для перетаскиваемого UIView при использовании UIPanGestureRecognizer - PullRequest
1 голос
/ 17 февраля 2012

Этот вопрос имеет отношение к этому сообщению, которое я сделал недавно: Перетащите UIView частично, затем он движется сам по себе

Короче говоря, у меня частично перетаскиваемый вид интерфейса.видимый внизу окна.Существует «язычок», который пользователь может использовать для перетаскивания вида вверх или вниз по экрану.Я наложил ограничения на позицию 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]];
            }
        }
    }

}

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

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

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

Экран по умолчанию с перетаскиваемым видом внизу и язычком

Вид перетаскивается до правильного максимального положения Y

Спасибо!

1 Ответ

2 голосов
/ 17 февраля 2012

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

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.)

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

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