Как использовать перетаскивание в UIScrollView

Я пытаюсь перетащить UIViews в UIScrollView. Я бы хотел, чтобы UIScrollView прокручивался, если я перетаскиваю UIView так, чтобы он пересекал верх или низ ScrollView. Если он коснется верхней части, он должен прокрутиться вверх. Если он коснется дна, он должен прокрутиться вниз. Как только UIView переместится так, что он больше не пересекает верх или низ, прокрутка должна прекратиться.

Первый подход, который я пробовал, состоял в том, чтобы запускать NSTimer всякий раз, когда я обнаруживал, что UIView пересекается с верхней или нижней частью прокрутки. Таймер будет прокручивать UIScrollView бит за битом, пока он не станет недействительным. Это привело к очень прерывистой прокрутке, поскольку невозможно предсказать, когда сработают таймеры.

Мой текущий подход состоит в том, чтобы просто прокрутить до самого верха или низа ScrollView, например:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:1.0];
[self.parentScrollview setContentOffset:newOffset animated:NO];
[UIView commitAnimations];

Чтобы остановить прокрутку, я пытаюсь определить положение касания в делегате touchesMoved: и использую это для вычисления contentOffset для использования для scrollView.

Проблема в том, что когда я пытаюсь получить местоположение в представлении с помощью [[touch anyObject] locationInView: self], я получаю окончательное конечное местоположение, а не текущее местоположение. Я предполагаю, что это потому, что contentOffset в scrollView устанавливается немедленно.

Есть ли способ узнать фактическое местоположение касания в такой ситуации? Или любым другим способом установить contentOffset, когда я прерываю анимацию прокрутки?


person Jerry SHen    schedule 21.03.2010    source источник


Ответы (1)


Это может быть поздно, но вы можете попробовать прервать старую анимацию новой анимацией, включая этот оператор:

    [UIView setAnimationBeginsFromCurrentState:YES];

Вы можете сделать новую анимацию очень короткой или нулевой продолжительностью, а затем установить делегата и setAnimationDidStopSelector для получения окончательного contentOffset значения.

person sehugg    schedule 23.09.2010