Это не самый красивый код, но он работает в симуляторе.
Чтобы этот код работал, вам нужно добавить переменную экземпляра.
Этот код может работать не так, как вы хотите, потому что онотслеживание «отрицательной» позиции 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
, а не положение пальца на экране.
Вот почему ваш код работает не так, как вы ожидаете.