Определить местоположение касания в UIScrollView?

Я хотел бы обнаружить (начальную) позицию касания в своем UIScrollView, когда пользователь начнет перетаскивать. Я столкнулся с этой проблемой, и многие, похоже, борются с этой самой проблемой. Теперь, пока я все еще не могу окунуться в голову, почему Apple не позволит пользователям получать доступ к сенсорной информации в виде прокрутки, я не могу не найти решение самостоятельно. Однако все мои попытки потерпели неудачу, поэтому я хотел бы спросить вас.

Вот что я думал:

Я установил UIPanGestureRecognizer, как это в своем подклассе UIScrollView, и добавьте его в свои распознаватели жестов:

UIPanGestureRecognizer *tapDrag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(touchedAndDragged:)];
tapDrag.cancelsTouchesInView = NO;
tapDrag.delegate = self;
[self addGestureRecognizer:tapDrag];  

И соответствующий метод:

-(void)touchedAndDragged:(UIPanGestureRecognizer*)t{

     CGPoint loc = [t locationInView:self];
     //do something with location (that is exactly what I need)
     //...

     //Now DISABLE and forward touches to scroll view, so that it scrolls normally
     t.enabled = NO;
     /****
     ?????
     *****/

}

Как указано в комментариях, я хотел бы отключить жест панорамы после того, как у меня есть точка, а затем отключить распознаватель (в то время как STILL перетаскивание!) и "передать" штрихи в мое представление прокрутки, чтобы пользователь мог прокручивать как обычно. Это вообще возможно? Есть ли другое решение?

Ответ 1

Ну UIScrollView уже имеет встроенный жест, который вы можете использовать. Использование будет таким же простым, как установка класса в качестве делегата представления прокрутки (для использования scrollViewWillBeginDragging) и использования UIPanGestureRecognizer -locationInView: для определения местоположения касания.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    CGPoint location = [scrollView.panGestureRecognizer locationInView:scrollView];
    NSLog(@"%@",NSStringFromCGPoint(location));
}

Ответ 2

Почему бы вам не захватить начальное местоположение в -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event, что будет более удобным и эффективным.