Перетаскивание UITableView - PullRequest
       3

Перетаскивание UITableView

0 голосов
/ 05 декабря 2011

Я использую UIPanGestureRecognizer, чтобы разрешить перетаскивать мой UITableView. В настоящее время я установил его так, чтобы UITableView нельзя было перетащить за 0 или на половину его ширины. Но теперь его рамка устанавливается в 0, когда я пытаюсь перетащить UITableView обратно в 0 из начала координат больше 0. Как я могу предотвратить это и разрешить перетаскивание UITableView обратно в 0? Я попробовал следующее, но не могу понять, почему приведенный код вызывает это.

- (void) handlePan:(UIPanGestureRecognizer *) pan {

    CGPoint point = [pan translationInView:_tableView];

    CGRect frame = [_tableView frame];

    if (point.x <= _tableView.frame.size.width / 2) {
        frame.origin.x = point.x;
    }

    NSLog(@"%f : %f", frame.origin.x, _tableView.frame.origin.x);
    //outline begin!
    if (frame.origin.x < 0 && _tableView.frame.origin.x >= 0) {
        frame.origin.x = 0;
    }
    //outline end!
    isFilterViewShowing = frame.origin.x > 0;

    [_tableView setFrame:frame];

}

1 Ответ

0 голосов
/ 05 декабря 2011

Это не самый красивый код, но он работает в симуляторе.
Чтобы этот код работал, вам нужно добавить переменную экземпляра.
Этот код может работать не так, как вы хотите, потому что онотслеживание «отрицательной» позиции x, так что вы получите некоторый «пороговый» эффект, который вам может не понадобиться в зависимости от вашего дизайна.

- (void) handlePan:(UIPanGestureRecognizer *) pan {

if (pan.state == UIGestureRecognizerStateBegan)
{
    //  cache the starting point of your tableView in an instance variable
    xStarter = _tableView.frame.origin.x;
}

// What is the translation
CGPoint translation = [pan translationInView:self.tableView];
//  Where does it get us
CGFloat newX = xStarter + translation.x;

CGFloat xLimit = self.tableView.superview.bounds.size.width / 2;

if (newX >= 0.0f && newX <= xLimit)
{
    //  newX is good, don't touch it
}
else if (newX < 0)
{
    newX = 0;
}
else if (newX > xLimit)
{
    newX = xLimit;
}

CGRect frame = self.tableView.frame;
frame.origin.x = newX;

[_tableView setFrame:frame];

if (pan.state == UIGestureRecognizerStateEnded)
{
    //  reset your starter cache
    xStarter = 0;
}
}

Вы заметили, как [pan translationInView:aView]; возвращаетсмещение pan gesture, а не положение пальца на экране.
Вот почему ваш код работает не так, как вы ожидаете.

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